Purpose: Generate multi-panel volcano plots for differential expression analysis across multiple predictors (leaf tissue, phosphorus treatment, inv4m genotype), highlighting genes selected by Mahalanobis distance outlier detection.
Input: CSV file containing differential expression
results with Mahalanobis outlier identification
(is_selected_DEG column).
Output: - Multi-panel volcano plots (3-panel, 2-panel, and single-panel versions) - Annotated results table (CSV) - LaTeX tables of top labeled genes by predictor × regulation
library(dplyr)
library(ggplot2)
library(ggrepel)
library(ggpubr)
library(ggtext)
library(kableExtra)
library(readr)
Purpose: Load differential expression results and filter to predictors of interest.
Approach: Import CSV and subset to leaf tissue, phosphorus treatment, and inv4m genotype effects. The input contains pre-calculated Mahalanobis distances and outlier flags from upstream analysis.
Expected outcome: Filtered dataset with three
predictor levels, retaining all columns including
is_selected_DEG for gene labeling.
predictor_order <- c("Leaf", "-P","Leaf:-P")
# Load DE results with Mahalanobis outlier detection
effects_df <- read.csv("~/Desktop/predictor_effects_leaf_interaction_model.csv") %>%
filter(predictor %in% predictor_order ) %>%
droplevels()
# Set predictor order: Leaf, -P, Inv4m
effects_df$predictor <- factor(effects_df$predictor, levels = predictor_order)
# Diagnostics
cat("Predictors in dataset (ordered):", levels(effects_df$predictor), "\n")
## Predictors in dataset (ordered): Leaf -P Leaf:-P
cat("Total genes:", nrow(effects_df), "\n")
## Total genes: 72033
cat("Genes per predictor:\n")
## Genes per predictor:
print(table(effects_df$predictor))
##
## Leaf -P Leaf:-P
## 24011 24011 24011
Purpose: Identify top genes to label in volcano plots based on Mahalanobis distance ranking.
Approach: For each predictor and regulation
direction, select the top N genes (default N=10) that are marked as
is_selected_DEG and have locus_label annotation in
selected_DEGs_curated_locus_label.csv. Load curated labels from the
external file, coalesce with existing labels, then filter for genes with
valid annotations to label in the plot.
Expected outcome: Data frame of genes to label, with custom label text from curated annotations.
# Load curated labels from external file
# curated <- read.csv("~/Desktop/selected_DEGs_curated_locus_label_2.csv") %>%
curated <- read.csv("~/Desktop/selected_DEGs_leaf_interaction_model.csv") %>%
select(
regulation,
predictor,
gene,
locus_symbol,
locus_label,
desc_merged,
mahalanobis,
logFC,
neglogP
)
# Set predictor order for curated data
curated$predictor <- factor(curated$predictor, levels = predictor_order)
# Define number of labels per predictor and regulation
label_counts <- data.frame(
predictor = c("Leaf", "Leaf", "-P", "-P", "Leaf:-P","Leaf:-P"),
regulation = c("Downregulated", "Upregulated",
"Downregulated", "Upregulated",
"Downregulated", "Upregulated"),
n_labels = c(21, 20, 10, 15,10,10),
stringsAsFactors = FALSE
)
# Select genes for labeling based on specified counts
to_plot <- curated %>%
ungroup() %>%
filter(!is.na(locus_label) & locus_label != "") %>%
arrange(regulation, predictor, -mahalanobis) %>%
left_join(label_counts, by = c("predictor", "regulation")) %>%
group_by(regulation, predictor) %>%
mutate(row_num = row_number()) %>%
filter(row_num <= n_labels) %>%
select(-row_num, -n_labels) %>%
arrange(-mahalanobis) %>%
ungroup() %>%
mutate(predictor = factor(predictor, levels = predictor_order)) %>%
data.frame()
# Diagnostics
cat("Total curated genes:", nrow(curated), "\n")
## Total curated genes: 122
cat("Genes with locus_label:", sum(!is.na(curated$locus_label) & curated$locus_label != ""), "\n")
## Genes with locus_label: 111
cat("\nSelected DEGs by regulation and predictor:\n")
##
## Selected DEGs by regulation and predictor:
with(curated, print(table(regulation, predictor)))
## predictor
## regulation Leaf -P Leaf:-P
## Downregulated 18 17 13
## Upregulated 19 17 11
cat("\nGenes selected for labeling:", nrow(to_plot), "\n")
##
## Genes selected for labeling: 79
cat("Labels per predictor/regulation:\n")
## Labels per predictor/regulation:
with(to_plot, print(table(regulation, predictor)))
## predictor
## regulation Leaf -P Leaf:-P
## Downregulated 18 10 10
## Upregulated 16 15 10
# Show configured label counts
cat("\nConfigured label counts:\n")
##
## Configured label counts:
print(label_counts)
## predictor regulation n_labels
## 1 Leaf Downregulated 21
## 2 Leaf Upregulated 20
## 3 -P Downregulated 10
## 4 -P Upregulated 15
## 5 Leaf:-P Downregulated 10
## 6 Leaf:-P Upregulated 10
Purpose: Create three-panel volcano plot showing logFC vs. FDR across all predictors.
Approach: Use faceted ggplot with: - Points colored by regulation status (down/Bellow threshold/up) - Text labels for top Mahalanobis-selected genes - Free x-axis scales to accommodate different effect size ranges - Expression formatting for axis labels
Expected outcome: Three-panel figure saved as high-resolution PNG.
# Custom formatting function for y-axis
scaleFUN <- function(x) sprintf("%.0f", x)
# Set regulation based on high-confidence DEG flag
effects_df$regulation[!effects_df$is_hiconf_DEG] <- "Unregulated"
to_plot <- to_plot %>% filter(
!(predictor=="Leaf" & regulation=="Upregulated" & neglogP < 2.5)
)
effects_df$predictor_label <- effects_df$predictor
effects_df$predictor_label[effects_df$predictor=="Leaf:-P"] <- "Leaf × -P"
# Generate three-panel plot
gene_volcano_3 <- effects_df %>%
ggplot(aes(x = logFC, y = neglogP, col = regulation)) +
ylab(expression(-log[10](italic(FDR)))) +
xlab(expression(log[2]("Fold Change"))) +
scale_y_continuous(labels = scaleFUN,expand = expansion(mult = c(0, 0.1)) ) +
geom_point(alpha = 0.3, size = 0.5) +
geom_text_repel(
data = to_plot,
aes(label = locus_label),
color = "black",
fontface="bold.italic",
segment.color ="grey",
force = 2,
size=7,
min.segment.length = 0,
max.overlaps = 50
) +
scale_color_manual(
name = "",
values = c("#00AFBB", "grey", "#bb0c00"),
labels = c("Downregulated", "Bellow threshold", "Upregulated")
) +
facet_wrap(. ~ predictor, scales = "free_x" ) +
guides(color = guide_legend(
reverse = TRUE,
override.aes = list(size = 6)
)) +
theme_classic2(base_size = 30) +
theme(
plot.title = element_blank(),
strip.text = element_blank(),
#strip.text = element_markdown( size=35),
legend.position = c(0.87, 0.95),
legend.background = element_rect(fill = "transparent"),
legend.spacing = unit(0, "line"),
legend.box.spacing = unit(0, "line"),
legend.text = element_text(size = 25),
legend.direction = "vertical",
plot.margin = margin(0, 5.5, 5.5,5.5, "pt"),
strip.background = element_blank()
)
# Load lipid volcano
if (file.exists("../results/lipid_volcano_3_TIC.rds")) {
lipid_volcano_3 <- readRDS("../results/lipid_volcano_3_TIC.rds")
cat("Loaded lipid volcano plot\n")
} else {
warning("Growth parameter plot not found. Run differential_lipid_analysis_leaf_treatment_interaction_model.Rmd first.")
}
## Loaded lipid volcano plot
# Load transcript MDS
if (file.exists("../results/transcript_MDS_12.rds")) {
p_transcript_MDS <- readRDS("../results/transcript_MDS_12.rds")
cat("Loaded growth parameter plot\n")
} else {
warning("transcript MDS plot not found. Run differential_expression_leaf_treatment_model.Rmd first.")
}
## Loaded growth parameter plot
if (file.exists("../results/lipid_MDS_23.rds")) {
p_lipid_MDS <- readRDS("../results/lipid_MDS_23.rds")
cat("Loaded fitted curves plot\n")
} else {
warning("Fitted curves plot not found. differential_lipid_analysis_leaf_treatment_interaction_model first.")
}
## Loaded fitted curves plot
compound_MDS<- ggpubr::ggarrange(
p_lipid_MDS,
p_transcript_MDS,
nrow=2,
align ="hv")
ggsave(
filename = "~/Desktop/compound_MDS.png",
plot = compound_MDS,
height = 14,
width = 8,
units = "in",
dpi = 150
)
compound_volcano<- ggpubr::ggarrange(
lipid_volcano_3,
gene_volcano_3,
ncol=1,
align ="v"
)
ggsave(
filename = "~/Desktop/compound_volcano.png",
plot = compound_volcano,
height = 12,
width = 14,
units = "in",
dpi = 150
)
compound_plot<- ggpubr::ggarrange(
compound_MDS,
compound_volcano,
ncol=2,
widths = c(0.5,1)
)
ggsave(
filename = "~/Desktop/compound_plot.png",
plot = compound_plot,
height = 12,
width = 20,
units = "in",
dpi = 150
)
compound_volcano
Purpose: Create two-panel volcano plot focusing on Leaf and -P predictors.
Approach: Filter data to exclude Inv4m, adjust legend position for two-panel layout.
Expected outcome: Two-panel figure saved as high-resolution PNG.
# Filter for Leaf and -P only
effects_2panel <- effects_df %>%
mutate(predictor = factor(predictor, levels = predictor_order)) %>%
filter(predictor %in% c("Leaf", "-P")) %>%
droplevels()
to_plot_2panel <- to_plot%>%
mutate(predictor = factor(predictor, levels = predictor_order)) %>%
filter(predictor %in% c("Leaf", "-P")) %>%
droplevels()
# to_plot_2panel%>% filter(locus_label=="hhtmp5")
# to_plot_2panel%>% filter(locus_label=="hhtmp5")
# to_plot_2panel$locus_label[to_plot_2panel$locus_label=="hhtmp5"] <- NA
# Generate two-panel plot
volcano_2panel <- effects_2panel %>%
ggplot(aes(x = logFC, y = neglogP, col = regulation)) +
ylab(expression(-log[10](italic(FDR)))) +
xlab(expression(log[2]("Fold Change"))) +
#scale_x_continuous(expand = expansion(mult = c(0.3, 0.3)),labels = scaleFUN) +
scale_y_continuous(expand = expansion(mult = c(0., 0.2)),labels = scaleFUN) +
geom_point(alpha = 0.3, size=0.3) +
geom_text_repel(
data = to_plot_2panel,
aes(label = locus_label),
color = "black",
segment.color="grey",
force = 1,
fontface="bold.italic",
size=5.5,
fontface = "italic",
min.segment.length = 0,
max.overlaps = 50
) +
scale_color_manual(
name = "",
values = c("#00AFBB", "grey", "#bb0c00"),
labels = c("Downregulated", "Bellow threshold", "Upregulated")
) +
facet_wrap(. ~ predictor, scales = "free_x") +
guides(color = guide_legend(
reverse = TRUE,
override.aes = list(size = 5)
)) +
theme_classic2(base_size = 30) +
theme(
# plot.title = element_blank(),
strip.text = element_markdown(size=35),
strip.background = element_blank(),
axis.title.y = element_text(size=25,margin = margin(r = -10)),
# axis.title.x = element_blank(),
#plot.margin = margin(5.5, 5.5, 30, 5.5, "pt"),
legend.position = c(0.15, 0.99),
legend.background = element_rect(fill = "transparent"),
legend.spacing = unit(0, "line"),
legend.box.spacing = unit(0, "line"),
legend.text = element_text(size = 20)
)
# Load lipid volcano
if (file.exists("../results/lipid_volcano_2_TIC.rds")) {
lipid_volcano_2 <- readRDS("../results/lipid_volcano_2_TIC.rds")
cat("Loaded lipid volcano plot\n")
} else {
warning("Growth parameter plot not found. Run differential_lipid_analysis_leaf_treatment_interaction_model.Rmd first.")
}
## Loaded lipid volcano plot
# Load transcript MDS
if (file.exists("../results/transcript_MDS_12.rds")) {
p_transcript_MDS <- readRDS("../results/transcript_MDS_12.rds")
cat("Loaded growth parameter plot\n")
} else {
warning("transcript MDS plot not found. Run differential_expression_leaf_treatment_model.Rmd first.")
}
## Loaded growth parameter plot
if (file.exists("../results/lipid_MDS_23.rds")) {
p_lipid_MDS <- readRDS("../results/lipid_MDS_23.rds")
cat("Loaded fitted curves plot\n")
} else {
warning("Fitted curves plot not found. differential_lipid_analysis_leaf_treatment_interaction_model first.")
}
## Loaded fitted curves plot
if (file.exists("../results/lipid_trajectory_6panel.rds")) {
p_lipid_examples <- readRDS("../results/lipid_trajectory_6panel.rds")
cat("Loaded fitted curves plot\n")
} else {
warning("Fitted curves plot not found. differential_lipid_analysis_leaf_treatment_interaction_model first.")
}
## Loaded fitted curves plot
top_panel <- cowplot::plot_grid(
p_transcript_MDS + theme(plot.margin = margin(l=5.5,r=-15, b=-5, "pt")),
volcano_2panel + ggpubr::rremove("xlab"),
nrow=1,
ncol=2,
rel_widths = c(1,2),
align = "h",
axis = "tb",
common.legend = TRUE,
legend = "left")
ggsave(
filename = "~/Desktop/top_panel.png",
plot = top_panel,
height = 6,
width = 18,
units = "in",
dpi = 150
)
bottom_panel <- cowplot::plot_grid(
p_lipid_MDS + theme(plot.margin = margin(l=5.5,r=-15, "pt")),
lipid_volcano_2 + ggpubr::rremove("xlab"),
nrow=1,
ncol=2,
rel_widths = c(1,2),
align = "h",
axis = "tb",
common.legend = TRUE,
legend = "left")
ggsave(
filename = "~/Desktop/bottom_panel.png",
plot = bottom_panel,
height = 6,
width = 18,
units = "in",
dpi = 150
)
compound_volcano<- ggpubr::ggarrange(
volcano_2panel,
lipid_volcano_2,
ncol=1,
align ="v"
)
cat("Figure saved: volcano_plot_2panel.png (10 x 6 inches @ 300 dpi)\n")
## Figure saved: volcano_plot_2panel.png (10 x 6 inches @ 300 dpi)
compound_MDS<- ggpubr::ggarrange(
p_lipid_MDS,
p_transcript_MDS,
ncol=2,
align ="hv")
print(compound_MDS)
print(volcano_2panel)
Purpose: Create single-panel volcano plot focusing exclusively on Inv4m genotype effects.
Approach: Filter data to Inv4m only, optimize layout for single panel with centered legend.
Expected outcome: Single-panel figure saved as high-resolution PNG.
# Filter for Inv4m only
effects_1panel <- effects_df %>%
filter(predictor == "Leaf:-P")
to_plot_1panel <- to_plot %>%
filter(predictor == "Leaf:-P")
# Generate single-panel plot
volcano_1panel <- effects_1panel %>%
ggplot(aes(x = logFC, y = neglogP, col = regulation)) +
ylab(expression(-log[10](italic(FDR)))) +
xlab(expression(log[2]("Fold Change"))) +
scale_y_continuous(labels = scaleFUN, breaks=0:6) +
geom_point(alpha = 0.3, size = 2) +
geom_text_repel(
data = to_plot_1panel,
aes(label = locus_label),
segment.color ="grey",
force = 2,
fontface = "bold.italic",
size=5,
color = "black",
min.segment.length = 0,
max.overlaps = 50,
size = 7
) +
scale_color_manual(
name = "",
values = c("#00AFBB", "grey", "#bb0c00"),
labels = c("Negative", "Bellow threshold", "Positive")
) +
guides(color = guide_legend(override.aes = list(size = 5))) +
theme_classic2(base_size = 25) +
theme(
plot.title = element_blank(),
legend.position = "top",
legend.background = element_rect(fill = "transparent"),
legend.spacing = unit(0, "line"),
legend.box.spacing = unit(0, "line"),
legend.text = element_text(size = 20),
legend.direction = "horizontal"
)
print(volcano_1panel)
ggsave(
filename = "~/Desktop/volcano_plot_LeafxP.png",
plot = volcano_1panel,
height = 7,
width = 7,
units = "in",
dpi = 150
)
cat("Figure saved: volcano_plot_LeafxP.png (6 x 6 inches @ 300 dpi)\n")
## Figure saved: volcano_plot_LeafxP.png (6 x 6 inches @ 300 dpi)
Purpose: Create formatted tables of labeled genes for manuscript inclusion, split by predictor and regulation combination.
Approach: Subset to labeled genes, round numeric values, format for publication, and export separate LaTeX tables for each predictor × regulation combination.
Expected outcome: Multiple LaTeX table files organized by predictor and regulation direction.
# Prepare table data
table_data <- curated %>%
#filter(!is.na(locus_label) & locus_label != "") %>%
group_by(predictor, regulation) %>%
arrange(predictor, regulation, -neglogP) %>%
mutate(
logFC = round(logFC, digits = 2),
neglogP = format(neglogP, digits = 2)
) %>%
select(predictor, regulation, gene, locus_label, desc_merged, neglogP, logFC) %>%
ungroup()
# Get unique predictor × regulation combinations
pred_reg_combinations <- table_data %>%
distinct(predictor, regulation) %>%
arrange(predictor, regulation)
# Generate separate LaTeX table for each combination
for (i in 1:nrow(pred_reg_combinations)) {
pred <- pred_reg_combinations$predictor[i]
reg <- pred_reg_combinations$regulation[i]
# Filter data for this combination
subset_data <- table_data %>%
filter(predictor == pred, regulation == reg)
# Create filename
filename <- paste0("~/Desktop/DEG_table_", pred, "_", reg, ".tex")
filename <- gsub(":", "_", filename)
filename <- gsub("-", "minus", filename) # Replace - with negP for filename
# Generate LaTeX table
subset_data %>%
select(-predictor, -regulation) %>%
kbl(
caption = paste0(
"Genes with ", tolower(reg), " expression in ", pred,
" condition, selected by Mahalanobis distance"
),
format = "latex",
col.names = c("Gene", "Label", "Description", "-log10(FDR)", "logFC"),
align = "lllrr",
booktabs = TRUE
) %>%
kable_classic(full_width = FALSE, latex_options = "HOLD_position") %>%
save_kable(file = filename, format = "latex")
cat("Saved:", filename, "(", nrow(subset_data), "genes )\n")
}
## Saved: ~/Desktop/DEG_table_Leaf_Downregulated.tex ( 18 genes )
## Saved: ~/Desktop/DEG_table_Leaf_Upregulated.tex ( 19 genes )
## Saved: ~/Desktop/DEG_table_minusP_Downregulated.tex ( 17 genes )
## Saved: ~/Desktop/DEG_table_minusP_Upregulated.tex ( 17 genes )
## Saved: ~/Desktop/DEG_table_Leaf_minusP_Downregulated.tex ( 13 genes )
## Saved: ~/Desktop/DEG_table_Leaf_minusP_Upregulated.tex ( 11 genes )
## Saved: ~/Desktop/DEG_table_NA_Downregulated.tex ( 0 genes )
## Saved: ~/Desktop/DEG_table_NA_Upregulated.tex ( 0 genes )
# Also generate combined table with all genes
table_data %>%
kbl(
caption = paste(
"All characterized genes selected by Mahalanobis distance outlier detection",
"across predictors and regulation directions"
),
format = "latex",
col.names = c("Predictor", "Regulation", "Gene", "Label", "Description",
"-log10(FDR)", "logFC"),
align = "llllrr",
booktabs = TRUE
) %>%
kable_classic(full_width = FALSE, latex_options = c("HOLD_position", "scale_down")) %>%
collapse_rows(columns = 1:2, latex_hline = "major") %>%
save_kable(file = "DEG_table_all_combined.tex", format = "latex")
cat("\nSaved: DEG_table_all_combined.tex (", nrow(table_data), "genes total )\n")
##
## Saved: DEG_table_all_combined.tex ( 122 genes total )
Purpose: Display HTML previews of tables for each predictor × regulation combination in the notebook.
# Display separate tables for each combination
for (i in 1:nrow(pred_reg_combinations)) {
pred <- pred_reg_combinations$predictor[i]
reg <- pred_reg_combinations$regulation[i]
# Filter data for this combination
subset_data <- table_data %>%
filter(predictor == pred, regulation == reg) %>%
select(-predictor, -regulation)
# Display header
cat("\n\n### ", pred, " / ", reg, "\n\n")
# Display table
tbl <- subset_data %>%
kbl(
caption = paste0(nrow(subset_data), " genes"),
col.names = c("Gene", "Label", "Description", "-log10(FDR)", "logFC")
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
print(tbl)
}
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
| Zm00001eb152840 | pcf7 | Transcription factor PCF7 | 7.5 | -1.48 |
| Zm00001eb151160 | ntf2 | NTF2 domain-containing protein | 7.5 | -1.15 |
| Zm00001eb076680 | sgrl1 | Protein STAY-GREEN LIKE, chloroplastic | 7.5 | -0.95 |
| Zm00001eb038410 | ucp4 | Mitochondrial uncoupling protein 4 | 7.5 | -0.70 |
| Zm00001eb329970 | tyrtr | Tyrosine-specific transport protein | 7.5 | -0.63 |
| Zm00001eb182020 | mph1 | protein MAINTENANCE OF PSII UNDER HIGH LIGHT 1 | 7.5 | -0.61 |
| Zm00001eb176730 | ndhb1 | photosynthetic NDH subunit of subcomplex B 1, chloroplastic | 7.5 | -0.52 |
| Zm00001eb391900 | tic32 | Short-chain dehydrogenase TIC 32, chloroplastic | 7.4 | -0.60 |
| Zm00001eb057540 | zmm4 | Zea mays MADS4 | 7.1 | -3.40 |
| Zm00001eb154820 | chk | Choline kinase | 7.1 | -0.53 |
| Zm00001eb016200 | bhlh1 | BHLH transcription factor | 6.0 | -3.62 |
| Zm00001eb364940 | plt29 | Lipid-transfer protein DIR1 | 5.2 | -2.80 |
| Zm00001eb214750 | zmm15 | Zea mays MADS-box 15 | 5.1 | -5.04 |
| Zm00001eb320160 | alkt1 | Alkyl transferase | 4.9 | -3.82 |
| Zm00001eb169010 | ccp18 | cysteine protease18 | 4.0 | -2.76 |
| Zm00001eb090330 | aatr1 | amino acid transporter1 | 3.8 | -3.01 |
| Zm00001eb421180 | fp3 | Farnesylated protein 3 | 3.8 | -3.23 |
| Zm00001eb411680 | glu2 | beta-glucosidase2 | 2.5 | -5.12 |
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
| Zm00001eb297390 | hir3 | hypersensitive induced reaction3 | 7.4 | 0.80 |
| Zm00001eb041700 | gt | Glycosyltransferase | 7.3 | 1.09 |
| Zm00001eb305330 | cyp6 | cytochrome P450 | 7.3 | 0.90 |
| Zm00001eb037440 | bhlh145 | bHLH-transcription factor 145 | 7.0 | 0.89 |
| Zm00001eb293310 | dnaj | DNAJ heat shock N-terminal domain-containing protein | 6.7 | 0.64 |
| Zm00001eb407630 | salt1 | SalT homolog1 | 6.5 | 2.54 |
| Zm00001eb275060 | 6.1 | 0.73 | ||
| Zm00001eb098650 | trpp2 | trehalose-6-phosphate phosphatase2 | 6.0 | 1.47 |
| Zm00001eb370960 | wrky111 | WRKY-transcription factor 111 | 6.0 | 0.60 |
| Zm00001eb163980 | sftp | Surfactant protein B containing protein | 6.0 | 0.53 |
| Zm00001eb261620 | imo | Indole-2-monooxygenase | 4.0 | 2.04 |
| Zm00001eb422900 | 2.8 | 1.91 | ||
| Zm00001eb104340 | mutl3 | MUTL protein homolog 3 | 2.3 | 1.96 |
| Zm00001eb169810 | sc4mol | sphinganine C4-monooxygenase 1 | 2.2 | 1.79 |
| Zm00001eb294140 | 2.1 | 1.90 | ||
| Zm00001eb002760 | cyp78a | Cytochrome P450 family 78 subfamily A polypeptide 8 | 1.8 | 2.45 |
| Zm00001eb137930 | dmas | 2’-deoxymugineic-acid 2’-dioxygenase | 1.6 | 1.89 |
| Zm00001eb403420 | abc_trans | ABC-type Co2+ transport system, permease component | 1.6 | 1.81 |
| Zm00001eb054710 | chemo | Chemocyanin | 1.5 | 1.89 |
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
| Zm00001eb433900 | alla1 | allantoinase1 | 6.4 | -1.93 |
| Zm00001eb211170 | toc | Translocase of chloroplast, chloroplastic | 5.9 | -1.61 |
| Zm00001eb214780 | ccp19 | cysteine protease19 | 5.9 | -1.95 |
| Zm00001eb070520 | bhlh148 | bHLH-transcription factor 148 | 5.8 | -2.12 |
| Zm00001eb243180 | sdc | Serine decarboxylase | 5.8 | -1.74 |
| Zm00001eb377880 | 5.3 | -1.63 | ||
| Zm00001eb114780 | cfm3 | CRM family member3 | 4.9 | -1.54 |
| Zm00001eb405630 | c3h | C3H transcription factor (Fragment) | 4.9 | -1.57 |
| Zm00001eb377890 | snf12 | SWI/SNF complex component SNF12-like protein | 4.8 | -1.64 |
| Zm00001eb248820 | 4.7 | -1.84 | ||
| Zm00001eb294690 | peamt2 | phosphoethanolamine N-methyltransferase 2 | 3.8 | -7.17 |
| Zm00001eb017120 | tps8 | terpene synthase8 | 3.3 | -4.87 |
| Zm00001eb066620 | tut7 | Terminal uridylyltransferase 7 | 2.7 | -4.38 |
| Zm00001eb279680 | aaap48 | amino acid/auxin permease48 | 2.3 | -4.39 |
| Zm00001eb324550 | nactf132 | NAC-transcription factor 132 | 2.2 | -4.33 |
| Zm00001eb292550 | sec14 | SEC14 cytosolic factor family protein / phosphoglyceride transfer family protein | 1.9 | -6.43 |
| Zm00001eb410750 | 1.4 | -4.18 |
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
| Zm00001eb003820 | pilncr1 | pi-deficiency-induced long non-coding RNA1 | 9.0 | 7.70 |
| Zm00001eb148590 | ips1 | induced by phosphate starvation1 | 9.0 | 7.10 |
| Zm00001eb241920 | gpx1 | glycerophosphodiester phosphodiesterase1 | 9.0 | 6.84 |
| Zm00001eb064450 | pap2 | purple acid phosphatase2 | 9.0 | 4.64 |
| Zm00001eb154650 | ppa | Inorganic pyrophosphatase 1 | 9.0 | 3.06 |
| Zm00001eb280120 | pfk1 | phosphofructose kinase1 | 9.0 | 2.58 |
| Zm00001eb063230 | plc6 | phospholipase C6 | 9.0 | 1.90 |
| Zm00001eb313760 | flz | FLZ-type domain-containing protein | 8.9 | 3.03 |
| Zm00001eb370610 | rfk1 | Riboflavin kinase | 8.9 | 3.98 |
| Zm00001eb007180 | gmp | Mannose-1-phosphate guanyltransferase alpha | 8.8 | 2.29 |
| Zm00001eb010130 | pap19 | purple acid phosphatase19 | 8.8 | 6.09 |
| Zm00001eb099420 | gmps1 | GMP synthase | 4.3 | 9.92 |
| Zm00001eb019570 | spx7 | SPX domain-containing membrane protein7 | 4.1 | 8.04 |
| Zm00001eb425050 | mdr1 | putative multidrug resistance protein | 3.6 | 8.23 |
| Zm00001eb108800 | uam1 | UDP-arabinopyranose mutase | 3.1 | 8.72 |
| Zm00001eb034810 | mgd2 | Monogalactosyldiacylglycerol synthase | 2.9 | 11.12 |
| Zm00001eb388800 | ltsr1 | Low temperature and salt responsive protein | 2.3 | 9.54 |
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
| Zm00001eb359280 | tat | Tat pathway signal sequence family protein | 5.6 | -0.56 |
| Zm00001eb207130 | cab | Chlorophyll a-b binding protein, chloroplastic | 5.4 | -1.35 |
| Zm00001eb389720 | fbpase | D-fructose-1,6-bisphosphate 1-phosphohydrolase | 5.3 | -0.81 |
| Zm00001eb070520 | bhlh148 | bHLH-transcription factor 148 | 5.1 | -0.96 |
| Zm00001eb212520 | psad1 | photosystem I subunit d1 | 4.6 | -0.62 |
| Zm00001eb179680 | cab | Chlorophyll a-b binding protein, chloroplastic | 4.6 | -0.55 |
| Zm00001eb111630 | med33a | Mediator of RNA polymerase II transcription subunit 33A | 4.4 | -0.60 |
| Zm00001eb362560 | ndho1 | NADH-plastoquinone oxidoreductase1 | 4.4 | -0.58 |
| Zm00001eb214780 | ccp19 | cysteine protease19 | 4.2 | -0.82 |
| Zm00001eb071770 | mex1 | maltose excess protein1 | 4.0 | -0.59 |
| Zm00001eb256120 | 3.8 | -1.41 | ||
| Zm00001eb235450 | taf2n | TATA-binding protein-associated factor 2N | 3.6 | -2.07 |
| Zm00001eb138960 | 2.1 | -2.11 |
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
| Zm00001eb157810 | pk | Pyruvate kinase | 5.6 | 1.18 |
| Zm00001eb376160 | mrpa3 | multidrug resistance-associated protein3 | 5.4 | 0.64 |
| Zm00001eb063230 | plc6 | phospholipase C6 | 4.5 | 0.56 |
| Zm00001eb144680 | rns | Ribonuclease T(2) | 4.4 | 0.61 |
| Zm00001eb339870 | pld16 | phospholipase D16 | 4.3 | 0.56 |
| Zm00001eb393060 | piplc | PI-PLC X domain-containing protein | 4.0 | 1.15 |
| Zm00001eb148030 | gmp1 | mannose-1-phosphate guanylyltransferase1 | 3.9 | 0.69 |
| Zm00001eb009430 | htm4 | Heptahelical transmembrane protein 4 | 3.9 | 0.63 |
| Zm00001eb011050 | bgal | Beta-galactosidase | 3.9 | 0.53 |
| Zm00001eb289800 | pah1 | phosphatidate phosphatase 1 | 3.9 | 0.58 |
| Zm00001eb263160 | ring | Zinc finger (C3HC4-type RING finger) family protein | 2.9 | 2.16 |
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
| Gene | Label | Description | -log10(FDR) | logFC |
|---|---|---|---|---|
cat("\n\nTotal genes across all tables:", nrow(table_data), "\n")
Total genes across all tables: 122
sessionInfo()
## R version 4.5.1 (2025-06-13)
## Platform: x86_64-apple-darwin20
## Running under: macOS Sequoia 15.6.1
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/4.5-x86_64/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-x86_64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## time zone: America/New_York
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] readr_2.1.5 kableExtra_1.4.0 ggtext_0.1.2 ggpubr_0.6.2
## [5] ggrepel_0.9.6 ggplot2_4.0.0 dplyr_1.1.4
##
## loaded via a namespace (and not attached):
## [1] gtable_0.3.6 xfun_0.53 bslib_0.9.0 rstatix_0.7.3
## [5] tzdb_0.5.0 vctrs_0.6.5 tools_4.5.1 generics_0.1.4
## [9] tibble_3.3.0 pkgconfig_2.0.3 RColorBrewer_1.1-3 S7_0.2.0
## [13] lifecycle_1.0.4 compiler_4.5.1 farver_2.1.2 stringr_1.5.2
## [17] textshaping_1.0.4 carData_3.0-5 litedown_0.7 htmltools_0.5.8.1
## [21] sass_0.4.10 yaml_2.3.10 Formula_1.2-5 pillar_1.11.1
## [25] car_3.1-3 jquerylib_0.1.4 tidyr_1.3.1 cachem_1.1.0
## [29] abind_1.4-8 commonmark_2.0.0 tidyselect_1.2.1 digest_0.6.37
## [33] stringi_1.8.7 purrr_1.1.0 labeling_0.4.3 cowplot_1.2.0
## [37] fastmap_1.2.0 grid_4.5.1 cli_3.6.5 magrittr_2.0.4
## [41] broom_1.0.10 withr_3.0.2 scales_1.4.0 backports_1.5.0
## [45] rmarkdown_2.30 ggsignif_0.6.4 ragg_1.5.0 hms_1.1.4
## [49] evaluate_1.0.5 knitr_1.50 viridisLite_0.4.2 markdown_2.0
## [53] rlang_1.1.6 gridtext_0.1.5 Rcpp_1.1.0 glue_1.8.0
## [57] xml2_1.4.0 svglite_2.2.2 rstudioapi_0.17.1 jsonlite_2.0.0
## [61] R6_2.6.1 systemfonts_1.3.1