NUE in Canola
Influence of heterozygosity on nitrogen use efficiency in hybrid and purebred lines of Brassica napus (L.). University of Giessen. (2015) MSc. Thesis.
Introduction
This is a vignette for my Masters thesis titled “Influence of heterozygosity on nitrogen use efficiency in hybrid and purebred lines of Brassica napus (L.)”.
Department of Agronomy and Plant Breeding I, Justus-Liebig-Universität, Gießen 35392, Germany
Materials and Methods
Experiment
Thirty Brassica napus cultivars, 20 hybrid and 10 purebred lines, both old and new, were grown in a greenhouse under two fertilizer treatments: no N fertilization (N1) and 200 kg N/ha (N2). For each experimental replicate of genotype and fertilizer treatment, nine plants were grown in containers of 0.16 m2 surface area, filled with 147.5 kg of soil with a dry matter content of 88.2% (130.1 kg dry mass), in the layout described below.
Data Collection & Analysis
Plant root mass, shoot mass, straw mass and seed mass was recorded, along with (NIRS) of seed for oil and protein content. Note: For plant shoots, 2 of the 9 plants were used for another study and not inluded in total mass measurements
Formulas
\(NUE=N_{in Seed}/N_{Available}\)
Calculation of N fertilizatio when 1.6g N is added to container:
\((1.6gN)*(\frac{1kg}{1000g})*(\frac{1}{0.16m^2})*(\frac{10000m^2}{1ha})=100\frac{kgN}{ha}\)
N1 - Calculation of available N in soil
\(N1=\frac{44.65\frac{mgNO_3}{kgsoil}+2.15\frac{mgNH_4}{kgsoil}*(130.1kgsoil)}{9plants}=677\frac{mgN}{perplant}\)
N2 - Calculation of available N with fertilization of 200 kg N/ha
\(N2=677\frac{mgN}{perplant}+\frac{2*(1600mgN)}{9plants}=1033\frac{mgN}{perplant}\)
Prepare Data
# devtools::install_github("derekmichaelwright/agData")
library(agData) # Loads: tidyverse, ggpubr, ggbeeswarm, ggrepel
library(readxl) # read_xlsx
# Cultivar data
<- c("Old Purebred", "New Purebred", "Old Hybrid", "New Hybrid")
cultivarTypes <- read_xlsx("data_canola_nue.xlsx", "CultData") %>%
r1 mutate(Hybrid = plyr::mapvalues(Hybrid, c("H", "P"), c("Hybrid", "Purebred")),
Age = plyr::mapvalues(Age, c("N", "O"), c("New", "Old")),
Type = factor(paste(Age, Hybrid), levels = cultivarTypes))
# Container data
<- read_xlsx("data_canola_nue.xlsx", "ContData") %>%
r2 mutate(Nlevel = paste0("N", Nlevel))
# Plant data
<- read_xlsx("data_canola_nue.xlsx", "PlantData")
r3 # NIRS data main
<- read_xlsx("data_canola_nue.xlsx", "NIRSmainRaw") %>%
r4 mutate(ErucicAcidPercent = ifelse(ErucicAcidPercent < 0,
0, ErucicAcidPercent),
DryContent = 100 - WaterPercent) %>%
group_by(Container) %>%
summarise_all(funs(mean), na.rm = T)
colnames(r4) <- paste0(colnames(r4),"_Main")
colnames(r4)[1] <- "Container"
# NIRS data side
<- read_xlsx("data_canola_nue.xlsx", "NIRSsideRaw")
r5 <- r5 %>% mutate(DryContent = 100 - WaterPercent) %>%
r5 mutate(ErucicAcidPercent = ifelse(ErucicAcidPercent < 0,
0, ErucicAcidPercent),
DryContent = 100 - WaterPercent) %>%
group_by(Container) %>%
summarise_all(funs(mean), na.rm = T)
colnames(r5) <- paste0(colnames(r5),"_Side")
colnames(r5)[1] <- "Container"
Notes:
- For straw mass 2 of the 9 plants were removed and used for another project.
- StemMass1: Small section of stem that was still attached to roots and removed prior to weighing.
- StemMass2: Bulk of straw collected during harvest.
<- left_join(r2, r1, by = c("Genotype"="Cultivar")) %>%
rr left_join(r3, by = "Container") %>%
left_join(r4, by = "Container") %>%
left_join(r5, by = "Container") %>%
mutate(RootMass = RootMass / 9,
StemMass = (StemMass1 + StemMass2) / 7,
StrawMass = (StrawMassMain + StrawMassSide) / 7,
ShootMass = StemMass + StrawMass,
SeedMassMainDry = SeedMassMain * DryContent_Main / 100 / 7,
SeedMassSideDry = SeedMassSide * DryContent_Side / 100 / 7,
SeedMass = SeedMassMainDry + SeedMassSideDry,
PlantMass = RootMass + StemMass + StrawMass + SeedMass,
HarvestIndex = SeedMass / ShootMass,
OilMassMain = OilPercent_Main * SeedMassMainDry / 100,
OilMassSide = OilPercent_Side * SeedMassSideDry / 100,
OilMass = OilMassMain + OilMassSide,
ProteinMassMain = ProteinPercent_Main * SeedMassMainDry / 100,
ProteinMassSide = ProteinPercent_Side * SeedMassSideDry / 100,
ProteinMass = ProteinMassMain + ProteinMassSide,
N_Available = ifelse(Nlevel == 1, 677, 1033),
NUE_P = ProteinMass * 0.16 / N_Available * 1000,
NUE_Y = SeedMass / N_Available * 1000) %>%
select(Container, Nlevel, AvailableN, Rep, Edge,
Genotype, CultLabel, CultNumber, Hybrid, Age, Type, Breeder,
RootMass, StemMass, StrawMass, ShootMass, SeedMass, everything()) %>%
NUE_P, NUE_Y, filter(Edge == "F")
<- colnames(rr)[13:ncol(rr)]
trts <- rr %>%
dd group_by(Nlevel, Genotype, CultLabel, Hybrid, Age, Type, Breeder) %>%
summarise_at(vars(trts), funs(mean), na.rm = T) %>%
ungroup()
<- rr %>%
dd_sd group_by(Nlevel, Genotype, CultLabel, Hybrid, Age, Type, Breeder) %>%
summarise_at(vars(trts), funs(sd), na.rm = T) %>%
ungroup()
Biomass
<- function(nlevel, title) {
gg_PlantMass <- dd %>%
x1 mutate(SeedMass = ifelse(Genotype == "Pacific" & Nlevel == "N2", 0, SeedMass),
StrawMass = ifelse(Genotype == "Pacific" & Nlevel == "N2", 0, StrawMass),
StemMass = ifelse(Genotype == "Pacific" & Nlevel == "N2", 0, StemMass),
RootMass = ifelse(Genotype == "Pacific" & Nlevel == "N2", 0, RootMass),
RootScore = ifelse(Genotype == "Pacific" & Nlevel == "N2", 0, RootScore))
<- x1 %>%
genoOrder filter(Nlevel == nlevel) %>%
arrange(SeedMass, Type) %>%
pull(Genotype)
<- x1 %>%
xi filter(Nlevel == nlevel, !is.na(StemMass), !is.na(StrawMass),
!is.na(SeedMass), !is.na(RootMass))
<- c("SeedMass","StrawMass","StemMass","RootMass")
traits1 <- c("Seed","Straw","Stem","Roots")
traits2 <- c("darkgreen","darkorange","forestgreen","brown")
colors <- xi %>%
xs select(Genotype, Hybrid, Type, StemMass, StrawMass, SeedMass) %>%
gather(Trait, Value, StemMass, StrawMass, SeedMass) %>%
mutate(Genotype = factor(Genotype, levels = genoOrder),
Trait = plyr::mapvalues(Trait, traits1, traits2),
Trait = factor(Trait, levels = traits2))
<- xi %>% rename(Value=RootMass) %>%
xr mutate(Genotype = factor(Genotype, levels = genoOrder),
Trait = "Roots",
Trait = factor(Trait, levels = traits2))
<- ggplot(xs, aes(x = Genotype, y = Value,
mp1 fill = Trait, group = Trait)) +
geom_bar(stat= "identity", aes(color = Trait)) +
geom_line(data = xs %>% filter(Trait == "Seed"), color = "black") +
facet_grid("Shoots" ~ Type, scales= "free_x", space = "free_x") +
scale_y_continuous(limits = c(0,85), expand = c(0,0)) +
scale_color_manual(name = NULL, breaks = traits2,
labels = traits2, values = colors) +
scale_fill_manual(name = NULL, breaks = traits2,
labels = traits2, values = alpha(colors,0.7)) +
theme_agData(axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
labs(title = title, x = NULL, y = "g")
<- ggplot(xr, aes(x = Genotype, y = Value)) +
mp2 geom_bar(stat = "identity", aes(fill = RootScore, color = "Roots")) +
geom_text(aes(label = RootScore, y = 1), size = 3) +
facet_grid("Roots" ~ Type, scales= "free_x", space = "free_x") +
scale_y_reverse(limits = c(11,0), expand = c(0,0)) +
scale_color_manual(guide = F, values = "brown") +
scale_fill_continuous(guide = F, low = alpha("brown",0.3),
high = alpha("brown",1)) +
theme_agData(axis.text.x = element_text(angle = 45, hjust = 1),
strip.text.x = element_blank()) +
labs(y = "g", x = NULL)
ggarrange(mp1, mp2, ncol = 1, align = "v", heights = c(1.3,1),
legend = "right", common.legend = T)
}#
<- gg_PlantMass("N2", "High Nitrogen Treatment")
mp1 <- gg_PlantMass("N1", "Low Nitrogen Treatment")
mp2 <- ggarrange(mp1, mp2, ncol = 1) %>%
mp annotate_figure(fig.lab.pos = "bottom.right",
fig.lab = "\u00A9 www.dblogr.com/ | Data: JLU")
ggsave("canola_nue_01.png", mp, width = 10, height = 10, bg = "white")
Rootmass
# Prep data
<- dd %>% arrange(RootMass) %>%
xx mutate(Genotype = factor(Genotype, levels = unique(.$Genotype)))
# Plot
<- ggplot(xx, aes(x = Genotype, y = RootMass, fill = Nlevel)) +
mp geom_bar(stat = "identity", position = "dodge",
color = "black", alpha = 0.7
+
) facet_grid(. ~ Type, scales = "free_x", space = "free_x") +
scale_fill_manual(values = c("steelblue", "darkblue")) +
theme_agData(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(caption = "\u00A9 www.dblogr.com/ | Data: JLU")
ggsave("canola_nue_02.png", mp, width = 8, height = 4)
N1 vs N2
<- function(myTrait) {
ggN1N2 # Prep data
<- dd %>% gather(Trait, Value, myTrait) %>%
xi mutate(Hybrid = factor(Hybrid, levels = c("Purebred","Hybrid")))
# Plot
ggplot(xi, aes(x = Hybrid, y = Value)) +
geom_violin(alpha = 0.7) +
geom_quasirandom(aes(fill = Hybrid), size = 2, pch = 21, alpha = 0.7) +
facet_grid(Trait ~ Nlevel, scales = "free_y", switch = "y") +
scale_fill_manual(name = NULL, values = c("darkred","steelblue")) +
theme_agData(legend.position = "none", strip.placement = "outside") +
labs(y = NULL, x = NULL,
caption = "\u00A9 www.dblogr.com/ | Data: JLU")
}
NUE Protein
# Plot
<- ggN1N2(myTrait = "NUE_P")
mp ggsave("canola_nue_03.png", mp, width = 6, height = 4)
NUE Yield
# Plot
<- ggN1N2(myTrait = "NUE_Y")
mp ggsave("canola_nue_04.png", mp, width = 6, height = 4)
Seed Mass
# Plot
<- ggN1N2(myTrait = "SeedMass")
mp ggsave("canola_nue_05.png", mp, width = 6, height = 4)
Root Mass
# Plot
<- ggN1N2(myTrait = "RootMass")
mp ggsave("canola_nue_06.png", mp, width = 6, height = 4)
NUE Protein
# Plot
<- ggN1N2(myTrait = "RootScore")
mp ggsave("canola_nue_07.png", mp, width = 6, height = 4)
Scatter Plot
<- function(trait = "NUE_P", title = trait) {
gg_Corr <- dd %>% select(Genotype, Type, Nlevel, Hybrid, Value=trait) %>%
xi spread(Nlevel, Value)
<- min(xi$N1, xi$N2, na.rm = T)
mymin <- max(xi$N1, xi$N2, na.rm = T)
mymax <- bind_rows(
x2 %>% filter(Type != "Old Purebred") %>% mutate(Type = "Old Purebred"),
xi %>% filter(Type != "New Purebred") %>% mutate(Type = "New Purebred"),
xi %>% filter(Type != "Old Hybrid") %>% mutate(Type = "Old Hybrid"),
xi %>% filter(Type != "New Hybrid") %>% mutate(Type = "New Hybrid") )
xi <- c("darkgreen","darkred","darkgreen","darkred")
myColors ggplot(xi, aes(x = N1, y = N2)) +
geom_point(aes(shape = Type, fill = Type), size = 3, alpha = 0.7) +
geom_point(data = x2, alpha = 0.2) + geom_abline() +
facet_wrap(Type~., ncol = 2) +
scale_fill_manual(values = myColors) +
scale_shape_manual(values = c(22, 23, 25, 24)) +
coord_cartesian(xlim = c(mymin, mymax), ylim = c(mymin, mymax)) +
theme_agData(legend.position = "none") +
labs(title = title, x = "Low N", y = "High N",
caption = "\u00A9 www.dblogr.com/ | Data: JLU")
}<- gg_Corr("PlantMass", "Plant Mass")
mp01 <- gg_Corr("ShootMass", "Shoot Mass")
mp02 <- gg_Corr("SeedMass", "Seed Mass")
mp03 <- gg_Corr("ProteinMass", "Protein Mass")
mp04 <- gg_Corr("OilMass", "Seed Oil Mass")
mp05 <- gg_Corr("RootMass", "Seed Root Mass")
mp06 <- gg_Corr("RootScore", "Root Branching Score")
mp07 <- gg_Corr("RootLength", "Root Length")
mp08 <- gg_Corr("NUE_P", "NUE Protein")
mp09 <- gg_Corr("NUE_Y", "NUE Yield")
mp10 <- ggarrange(mp01, mp02, mp03, mp04, mp05,
mp ncol = 5, nrow = 2)
mp06, mp07, mp08, mp09, mp10, ggsave("canola_nue_08.png", mp, width = 14, height = 8)
Treatment Change
# Plotting function
<- function(trait = "ProteinMass", title = trait) {
gg_Diff <- dd %>%
xi rename(Value = trait) %>%
select(Nlevel, Genotype, CultLabel, Hybrid, Age, Type, Value) %>%
spread(Nlevel, Value) %>%
mutate(Diff = N2 - N1,
Diff2 = ifelse(Diff > 0, "Positive", "Negative"),
Diff2 = factor(Diff2, levels = c("Positive","Negative"))) %>%
gather(Nlevel, Value, N1, N2) %>%
filter(!is.na(Diff))
#
ggplot(xi, aes(x = Nlevel, y = Value, color = Diff2)) +
geom_line(aes(group = Genotype)) +
geom_label(aes(label = CultLabel), size = 2.5,
label.padding = unit(0.15, "lines")) +
facet_grid(. ~ Type) +
scale_color_manual(values = c("darkgreen", "darkred")) +
theme_agData(legend.position = "none") +
labs(title = title, x = NULL, y = NULL,
caption = "\u00A9 www.dblogr.com/ | Data: JLU")
}# Plot
<- gg_Diff("ShootMass", "Shoot Mass")
mp01 <- gg_Diff("SeedMass", "Seed Mass")
mp02 <- gg_Diff("ProteinMass", "Seed Protein Mass")
mp03 <- gg_Diff("OilMass", "Seed Oil Mass")
mp04 <- gg_Diff("RootMass", "Root Mass")
mp05 <- gg_Diff("RootLength", "Root Length")
mp06 <- gg_Diff("RootScore", "Root Branching Score")
mp07 <- gg_Diff("NUE_Y", "NUE Yield")
mp08 <- ggarrange(mp01, mp02, mp03, mp04, ncol = 2, nrow = 2)
mp ggsave("canola_nue_09.png", mp, width = 9, height = 6)
<- ggarrange(mp05, mp06, mp07, mp08, ncol = 2, nrow = 2)
mp ggsave("canola_nue_10.png", mp, width = 9, height = 6)
Correlation Plots
library(corrplot)
<- c("RootMass", "RootScore", "StemMass", "ShootMass",
traits "StrawMass", #"StrawMassMain", #"StrawMassSide",
"SeedMass", "SeedMassMain", "SeedMassSide",
"NUE_P", "NUE_Y", "RootLength",
"ProteinMass", "OilMass", "HarvestIndex",
"OilPercent_Main", "OilPercent_Side",
"ProteinPercent_Main", "ProteinPercent_Side")
<- dd %>% filter(Nlevel == "N1", !is.na(RootMass)) %>% select(traits)
m1 <- dd %>% filter(Nlevel == "N2", !is.na(RootMass)) %>% select(traits)
m2 #
png("canola_nue_11.png", width = 600, height = 600)
<- corrplot(cor(m1), addrect=2)#order = "hclust",
mp1 dev.off()
#
png("canola_nue_12.png", width = 600, height = 600)
<- corrplot(cor(m2), addrect=2)
mp2 dev.off()