Load libraries

library(car)
## Loading required package: carData
require(ggplot2)
## Loading required package: ggplot2
require(tidyverse)
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ lubridate 1.9.5     ✔ tibble    3.3.1
## ✔ purrr     1.2.2     ✔ tidyr     1.3.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ dplyr::recode() masks car::recode()
## ✖ purrr::some()   masks car::some()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidyr)
library(dplyr)
library(emmeans)
## Welcome to emmeans.
## Caution: You lose important information if you filter this package's results.
## See '? untidy'
library(agricolae)
library(multcomp)
## Loading required package: mvtnorm
## Loading required package: survival
## Loading required package: TH.data
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
## 
## 
## Attaching package: 'TH.data'
## 
## The following object is masked from 'package:MASS':
## 
##     geyser
library(multcompView)
library(ggpubr)
library(ggpmisc)
## Loading required package: ggpp
## Registered S3 methods overwritten by 'ggpp':
##   method                  from   
##   heightDetails.titleGrob ggplot2
##   widthDetails.titleGrob  ggplot2
## 
## Attaching package: 'ggpp'
## 
## The following objects are masked from 'package:ggpubr':
## 
##     as_npc, as_npcx, as_npcy
## 
## The following object is masked from 'package:ggplot2':
## 
##     annotate
library(ggthemes)
library(nlme)
## 
## Attaching package: 'nlme'
## 
## The following object is masked from 'package:dplyr':
## 
##     collapse
library(lme4)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## Registered S3 method overwritten by 'lme4':
##   method           from
##   na.action.merMod car 
## 
## Attaching package: 'lme4'
## 
## The following object is masked from 'package:nlme':
## 
##     lmList
library(lmerTest)
## 
## Attaching package: 'lmerTest'
## 
## The following object is masked from 'package:lme4':
## 
##     lmer
## 
## The following object is masked from 'package:stats':
## 
##     step
library(readxl)
library(openxlsx)

Import Data

#import data
npj_data<-read_excel("npj_data.xlsx")
#convert variables to factors
npj_data$location<-as.factor(npj_data$location)
npj_data$row<-as.factor(npj_data$row)
npj_data$trt<-as.factor(npj_data$trt)
npj_data$position<-as.factor(npj_data$position)
npj_data$stage<-as.factor(npj_data$stage)
str(npj_data)
## tibble [192 × 45] (S3: tbl_df/tbl/data.frame)
##  $ stage                          : Factor w/ 2 levels "V3","V6": 1 1 1 1 1 1 1 1 1 1 ...
##  $ location                       : Factor w/ 2 levels "Neb","NH": 1 1 1 1 1 1 1 1 1 1 ...
##  $ row                            : Factor w/ 8 levels "R1","R2","R3",..: 1 1 1 1 1 1 3 3 3 3 ...
##  $ trt                            : Factor w/ 6 levels "Both 1x","Both 2x",..: 3 4 5 6 1 2 3 4 5 6 ...
##  $ position                       : Factor w/ 2 levels "Band","In-row": 2 2 2 2 2 2 2 2 2 2 ...
##  $ totN_applied_kgha              : num [1:192] 5.18 10.36 73.98 147.95 79.15 ...
##  $ avg_shoot_wt_g                 : num [1:192] 0.823 0.77 0.463 0.395 0.39 ...
##  $ avg_root_wt_g                  : num [1:192] 0.4 0.25 0.26 0.2 0.26 0.39 0.36 0.34 0.2 0.28 ...
##  $ avg_root_wt_band               : num [1:192] NA NA NA NA NA NA NA NA NA NA ...
##  $ avg_root_wt_tot                : num [1:192] 0.4 0.25 0.26 0.2 0.26 0.39 0.36 0.34 0.2 0.28 ...
##  $ totN_shoot_kgha                : num [1:192] 2.95 2.9 2.11 2 1.69 ...
##  $ totN_root_kgha                 : num [1:192] 0.705 0.504 0.595 0.539 0.593 ...
##  $ APE_shoot                      : num [1:192] 2.44 5.43 2.45 3.99 3.18 ...
##  $ APE_root                       : num [1:192] 2.66 3.83 2.02 2.45 2.96 ...
##  $ perNdff_shoot                  : num [1:192] 29.2 65 29.4 47.8 38.1 ...
##  $ perN_dff_root                  : num [1:192] 31.9 45.9 24.2 29.3 35.5 ...
##  $ FertN_shoot_kg_ha              : num [1:192] 0.863 1.888 0.619 0.956 0.643 ...
##  $ FertN_root_kg_ha               : num [1:192] 0.225 0.231 0.144 0.158 0.211 ...
##  $ perRecov_shoot                 : num [1:192] 16.671 18.23 0.836 0.646 0.812 ...
##  $ perRecov_root                  : num [1:192] 4.335 2.227 0.194 0.106 0.265 ...
##  $ totC_shoot_kgha                : num [1:192] 30.8 29.2 17.2 14.6 14.9 ...
##  $ totC_root_kgha                 : num [1:192] 14.95 9.21 9.3 7.33 9.59 ...
##  $ ug_NO3-N_g                     : num [1:192] 0.753 2.583 1.526 2.257 1.62 ...
##  $ ug_NH4-N_g                     : num [1:192] 3.729 6.263 1.243 0.895 4.393 ...
##  $ ug_DIN_g                       : num [1:192] 4.48 8.85 2.77 3.15 6.01 ...
##  $ pH                             : num [1:192] 5.24 6.44 6.3 6.17 5.94 6.08 6.02 6.5 6.58 6.44 ...
##  $ fracMAOM_gperg                 : num [1:192] 0.859 0.879 0.85 0.835 0.849 ...
##  $ fracPOM_gperg                  : num [1:192] 0.061 0.041 0.0972 0.082 0.0699 ...
##  $ perNdff_TDN                    : num [1:192] 0.459 12.593 0.572 0.678 1.739 ...
##  $ kgN_dff_TDN_ha                 : num [1:192] 0.00322 0.11166 0.00349 0.0045 0.01102 ...
##  $ kgN_dff_TDN_ha_band            : num [1:192] 0.01573 0.00387 1.39498 4.55123 8.20886 ...
##  $ kgN_dff_TDN_ha_furrowband      : num [1:192] 0.0189 0.1155 1.3985 4.5557 8.2199 ...
##  $ per_Recov_TDN_tot              : num [1:192] 0.366 1.115 1.89 3.079 10.385 ...
##  $ perN_dff_wholesoil             : num [1:192] 0.502 2.091 0.158 0.69 1.366 ...
##  $ kgN_dff_wholesoil_ha           : num [1:192] 0.888 3.646 0.282 1.294 2.479 ...
##  $ kgN_dff_wholesoil_ha_furrowband: num [1:192] 1.11 4.05 15.55 48.34 23.81 ...
##  $ per_Recov_wholesoil_tot        : num [1:192] 21.5 39.1 21 32.7 30.1 ...
##  $ perN_dff_MAOM                  : num [1:192] 0.372 0.985 0.136 0.43 0.72 ...
##  $ kgN_dff_MAOM_ha                : num [1:192] 0.547 1.427 0.206 0.595 0.95 ...
##  $ kgN_dff_MAOM_ha_furrowband     : num [1:192] 0.83 1.86 8.29 17.69 9.88 ...
##  $ per_Recov_MAOM_tot             : num [1:192] 16 18 11.2 12 12.5 ...
##  $ kgN_dff_MBN_ha                 : num [1:192] 0.01473 0 0.00101 0.0237 0.00318 ...
##  $ kgN_dff_MBN_ha_band            : num [1:192] 0 0.00558 0.44992 0.54043 1.07801 ...
##  $ kgN_dff_MBN_ha_furrowband      : num [1:192] 0.01473 0.00558 0.45093 0.56414 1.08119 ...
##  $ per_Recov_MBN_tot              : num [1:192] 0.2844 0.0539 0.6096 0.3813 1.3659 ...

Data wrangling

 # Duplicate data
data_new <- npj_data   
 # Reorder factor levels
data_new$trt <- factor(data_new$trt,    
                       c( "InF 1x", "InF 2x", "UAN 1x"
                         , "Both 1x","UAN 2x", "Both 2x"))
#Recode trt names
data_new<- data_new %>%
  mutate(trt = dplyr::recode(
    trt,
    "InF 1x"  = "InF-5",
    "InF 2x"  = "InF-10",
    "UAN 1x" = "UAN-74",
    "Both 1x" = "Both-79",
    "UAN 2x" = "UAN-148",
    "Both 2x" = "Both-158"
  ))

#Reorder factor levels
data_new$trt <- factor(data_new$trt,     
                     c( "InF-5", "InF-10", "UAN-74"
                        , "Both-79","UAN-148", "Both-158"))

#Recode location names
data_new <- data_new |>
  dplyr::mutate(location = dplyr::recode(location,
                                 "Neb" = "NE",
                                 "NH"     = "NH"
  ))

#Convert root and shoot weight from g to kg/ha and make new columns
data_new$shoot_wt<- (data_new$avg_shoot_wt_g/1000)*86000
data_new$root_wt<- (data_new$avg_root_wt_g/1000)*86000
data_new$root_wt_tot<- (data_new$avg_root_wt_tot/1000)*86000

#only furrow roots
data_new$root_wt_inf <- ifelse(
  data_new$position == "In-row",
  (data_new$avg_root_wt_g / 1000) * 86000,
  NA_real_
)

data_new$totN_root_kgha_inf <- ifelse(
  data_new$position == "In-row",   data_new$totN_root_kgha,  NA_real_
)

data_new$FertN_root_kg_ha_inf <- ifelse(
  data_new$position == "In-row",   data_new$FertN_root_kg_ha,  NA_real_
)

data_new$perRecov_root_inf <- ifelse(
  data_new$position == "In-row",   data_new$perRecov_root,  NA_real_
)


#Calculate soil-derived N (kg/ha) in shoot and root and make new columns
data_new$Ndf_notfert<-(data_new$totN_shoot_kgha)-(data_new$FertN_shoot_kg_ha)
data_new$Ndf_notfertroot<-(data_new$totN_root_kgha)-(data_new$FertN_root_kg_ha)

#SUBSET DATA

dat_Neb<-subset(data_new, data_new$location == "NE")
dat_NH<-subset(data_new, data_new$location == "NH")

dat_V3<-subset(data_new, data_new$stage == "V3")
dat_V6<-subset(data_new, data_new$stage == "V6")

dat_Neb_V3<-subset(dat_Neb, dat_Neb$stage == "V3")
dat_NH_V3<-subset(dat_NH, dat_NH$stage == "V3")
dat_Neb_V6<-subset(dat_Neb, dat_Neb$stage == "V6")
dat_NH_V6<-subset(dat_NH, dat_NH$stage == "V6")

dat_Neb_V3_Inf<-subset(dat_Neb_V3, dat_Neb_V3$position == "In-row")
dat_NH_V3_Band<-subset(dat_NH_V3, dat_NH_V3$position== "Band")
dat_Neb_V3_Band<-subset(dat_Neb_V3, dat_Neb_V3$position == "Band")
dat_NH_V3_Inf<-subset(dat_NH_V3, dat_NH_V3$position== "In-row")

dat_Neb_V6_Inf<-subset(dat_Neb_V6, dat_Neb_V6$position == "In-row")
dat_NH_V6_Band<-subset(dat_NH_V6, dat_NH_V6$position== "Band")
dat_Neb_V6_Band<-subset(dat_Neb_V6, dat_Neb_V6$position == "Band")
dat_NH_V6_Inf<-subset(dat_NH_V6, dat_NH_V6$position== "In-row")

InF<-subset(data_new, data_new$position == "In-row")
Band<-subset(data_new, data_new$position == "Band")

InF_V3<-subset(InF, InF$stage == "V3")
Band_V3<-subset(Band, Band$stage == "V3")

InF_V6<-subset(InF, InF$stage == "V6")
Band_V6<-subset(Band, Band$stage == "V6")

Theme Manjot

theme_Manjot <- function(base_size=14, base_family="TT Times New Roman") {(theme_foundation(base_size=base_size, base_family=base_family)+
                                                                            theme_bw()+ 
                                                                            theme(
                                                                                  panel.background = element_rect(colour = NA),
                                                                                  plot.background = element_rect(colour = NA),
                                                                                  axis.title = element_text(color="black",size=rel(1.5)),
                                                                                  axis.text = element_text(color="black", size =rel(1.2)),
                                                                                  legend.key = element_rect(colour = NA),
                                                                                  legend.spacing = unit(0, "cm"),
                                                                                  legend.text = element_text(size= rel(1.4)),
                                                                                  legend.title = element_text(size=rel(1.4)),
                                                                                  panel.grid = element_blank(),
                                                                                  plot.title = element_text(color="Black",size = rel(2),face = "bold",hjust = 0),
                                                                                  strip.text = element_text(color="Black",size = rel(1.5),face="bold")
                                                                            ))
}

Overall ANOVA

#variables with both position data separate
soil_vars <- c(
  "kgN_dff_MAOM_ha",
  "kgN_dff_wholesoil_ha",
  "kgN_dff_TDN_ha",
  "kgN_dff_MBN_ha",
  "ug_NO3-N_g",
  "ug_NH4-N_g",
  "ug_DIN_g",
  "pH"
)

#variable with combined/single position data
plant_vars <- c(
  "shoot_wt",
  "root_wt_tot",
  "root_wt_inf",
  "totN_shoot_kgha",
  "FertN_shoot_kg_ha",
  "totN_root_kgha_inf",
  "FertN_root_kg_ha_inf",
  "perRecov_shoot",
  "perRecov_root_inf",
 "Ndf_notfert", 
 "per_Recov_TDN_tot",
  "per_Recov_MBN_tot",
  "per_Recov_wholesoil_tot",
  "per_Recov_MAOM_tot"
)


get_anova_soil <- function(response_var, data) {
  
  dat <- data %>%
    dplyr::select(all_of(c(response_var, "trt", "location", "stage", "position", "row"))) %>%
    dplyr::filter(!is.na(.data[[response_var]])) %>%
    droplevels()
  
  if (
    nrow(dat) == 0 ||
    nlevels(factor(dat$trt)) < 2 ||
    nlevels(factor(dat$location)) < 2 ||
    nlevels(factor(dat$stage)) < 2 ||
    nlevels(factor(dat$position)) < 2
  ) {
    return(
      tibble(
        response = response_var,
        term = NA_character_,
        p_value = NA_real_,
        model_type = "soil_full",
        status = "skipped"
      )
    )
  }
  
  form <- as.formula(
    paste(response_var, "~ trt * location * stage * position + (1 | location:row)")
  )
  
  mod <- tryCatch(
    lmer(form, data = dat),
    error = function(e) e
  )
  
  if (inherits(mod, "error")) {
    return(
      tibble(
        response = response_var,
        term = NA_character_,
        p_value = NA_real_,
        model_type = "soil_full",
        status = mod$message
      )
    )
  }
  
  anova(mod) %>%
    as.data.frame() %>%
    tibble::rownames_to_column("term") %>%
    dplyr::transmute(
      response = response_var,
      term = term,
      p_value = `Pr(>F)`,
      model_type = "soil_full",
      status = "ok"
    )
}

get_anova_plant <- function(response_var, data) {
  
  dat <- data %>%
    dplyr::select(all_of(c(response_var, "trt", "location", "stage", "row"))) %>%
    dplyr::filter(!is.na(.data[[response_var]])) %>%
    droplevels()
  
  if (
    nrow(dat) == 0 ||
    nlevels(factor(dat$trt)) < 2 ||
    nlevels(factor(dat$location)) < 2 ||
    nlevels(factor(dat$stage)) < 2
  ) {
    return(
      tibble(
        response = response_var,
        term = NA_character_,
        p_value = NA_real_,
        model_type = "plant_no_position",
        status = "skipped"
      )
    )
  }
  
  form <- as.formula(
    paste(response_var, "~ trt * location * stage + (1 | location:row)")
  )
  
  mod <- tryCatch(
    lmer(form, data = dat),
    error = function(e) e
  )
  
  if (inherits(mod, "error")) {
    return(
      tibble(
        response = response_var,
        term = NA_character_,
        p_value = NA_real_,
        model_type = "plant_no_position",
        status = mod$message
      )
    )
  }
  
  anova(mod) %>%
    as.data.frame() %>%
    tibble::rownames_to_column("term") %>%
    dplyr::transmute(
      response = response_var,
      term = term,
      p_value = `Pr(>F)`,
      model_type = "plant_no_position",
      status = "ok"
    )
}

soil_anova_table <- purrr::map_dfr(soil_vars, get_anova_soil, data = data_new)
## boundary (singular) fit: see help('isSingular')
## boundary (singular) fit: see help('isSingular')
plant_anova_table <- purrr::map_dfr(plant_vars, get_anova_plant, data = data_new)
## boundary (singular) fit: see help('isSingular')
final_anova_table <- dplyr::bind_rows(soil_anova_table, plant_anova_table)

final_table_wide <- final_anova_table %>%
  dplyr::filter(!is.na(term)) %>%
  dplyr::select(response, model_type, term, p_value) %>%
  tidyr::pivot_wider(
    names_from = term,
    values_from = p_value
  )
final_table_wide <- final_table_wide %>%
  dplyr::mutate(across(where(is.numeric), ~ case_when(
    . < 0.001 ~ "<0.001",
    TRUE ~ sprintf("%.3f", .)
  )))

write.xlsx(final_table_wide, "final_anova_table14.xlsx")
## Warning in file.create(to[okay]): cannot create file
## 'final_anova_table14.xlsx', reason 'Permission denied'
knitr::kable(
  final_table_wide,
  format = "html",
  caption = "ANOVA full dataset"
)
ANOVA full dataset
response model_type trt location stage position trt:location trt:stage location:stage trt:position location:position stage:position trt:location:stage trt:location:position trt:stage:position location:stage:position trt:location:stage:position
kgN_dff_MAOM_ha soil_full <0.001 0.023 0.001 <0.001 0.867 0.725 0.133 <0.001 0.285 0.006 0.697 0.840 0.136 0.556 0.827
kgN_dff_wholesoil_ha soil_full <0.001 <0.001 <0.001 <0.001 0.032 0.010 0.290 <0.001 <0.001 <0.001 0.808 0.034 0.002 0.312 0.881
kgN_dff_TDN_ha soil_full <0.001 0.002 <0.001 <0.001 <0.001 <0.001 0.118 <0.001 <0.001 <0.001 0.266 <0.001 <0.001 0.014 0.234
kgN_dff_MBN_ha soil_full 0.063 0.024 0.135 <0.001 0.269 0.613 0.552 0.064 0.005 0.094 0.965 0.259 0.638 0.490 0.959
ug_DIN_g soil_full <0.001 <0.001 <0.001 <0.001 0.002 <0.001 0.018 <0.001 <0.001 <0.001 0.129 0.002 <0.001 0.003 0.123
pH soil_full <0.001 <0.001 0.849 0.399 0.001 <0.001 0.928 0.002 0.339 <0.001 0.161 0.021 <0.001 <0.001 0.769
shoot_wt plant_no_position 0.130 0.001 <0.001 NA 0.376 0.428 0.002 NA NA NA 0.377 NA NA NA NA
root_wt_tot plant_no_position 0.023 0.007 <0.001 NA 0.253 0.071 0.004 NA NA NA 0.178 NA NA NA NA
root_wt_inf plant_no_position 0.048 0.062 <0.001 NA 0.547 0.292 0.028 NA NA NA 0.421 NA NA NA NA
totN_shoot_kgha plant_no_position <0.001 <0.001 <0.001 NA 0.116 <0.001 <0.001 NA NA NA 0.234 NA NA NA NA
FertN_shoot_kg_ha plant_no_position <0.001 <0.001 <0.001 NA <0.001 <0.001 <0.001 NA NA NA <0.001 NA NA NA NA
totN_root_kgha_inf plant_no_position <0.001 0.020 <0.001 NA 0.103 <0.001 0.004 NA NA NA 0.003 NA NA NA NA
FertN_root_kg_ha_inf plant_no_position <0.001 0.005 <0.001 NA 0.182 <0.001 <0.001 NA NA NA 0.008 NA NA NA NA
perRecov_shoot plant_no_position <0.001 0.034 <0.001 NA 0.024 0.236 0.025 NA NA NA 0.150 NA NA NA NA
perRecov_root_inf plant_no_position <0.001 0.003 0.037 NA <0.001 0.970 0.003 NA NA NA 0.008 NA NA NA NA
Ndf_notfert plant_no_position 0.240 <0.001 <0.001 NA 0.138 0.402 <0.001 NA NA NA 0.091 NA NA NA NA
per_Recov_TDN_tot plant_no_position <0.001 0.001 <0.001 NA <0.001 <0.001 0.154 NA NA NA 0.424 NA NA NA NA
per_Recov_MBN_tot plant_no_position 0.052 0.039 0.187 NA 0.144 0.740 0.557 NA NA NA 0.938 NA NA NA NA
per_Recov_wholesoil_tot plant_no_position 0.007 <0.001 <0.001 NA 0.138 0.002 0.866 NA NA NA 0.477 NA NA NA NA
per_Recov_MAOM_tot plant_no_position <0.001 0.003 0.001 NA <0.001 <0.001 0.736 NA NA NA 0.009 NA NA NA NA

Crop biomass graph

#Shoot biomass kg ha-1 model
model_v3_neb_shoot <- lm(shoot_wt ~ trt + row, data = dat_Neb_V3)
model_v6_neb_shoot <- lm(shoot_wt ~ trt + row, data = dat_Neb_V6)
model_v3_nh_shoot  <- lm(shoot_wt ~ trt + row, data = dat_NH_V3)
model_v6_nh_shoot  <- lm(shoot_wt ~ trt + row, data = dat_NH_V6)

emm_v3_neb_shoot <- emmeans(model_v3_neb_shoot, ~ trt)
emm_v6_neb_shoot <- emmeans(model_v6_neb_shoot, ~ trt)
emm_v3_nh_shoot  <- emmeans(model_v3_nh_shoot,  ~ trt)
emm_v6_nh_shoot  <- emmeans(model_v6_nh_shoot,  ~ trt)

cld_v3_neb_shoot <- cld(emm_v3_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_shoot <- cld(emm_v6_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_shoot  <- cld(emm_v3_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_shoot  <- cld(emm_v6_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

shoot_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_shoot) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_shoot) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_shoot)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_shoot)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr::rename(shoot_cld = .group) %>%
  dplyr::mutate(shoot_cld = gsub(" ", "", shoot_cld)) %>%
  dplyr::select(trt, location, stage, shoot_cld)

# ROOT models
model_v3_neb_root <- lm(root_wt_inf ~ trt + row, data = dat_Neb_V3_Inf)
model_v6_neb_root <- lm(root_wt_inf ~ trt + row, data = dat_Neb_V6_Inf)
model_v3_nh_root  <- lm(root_wt_inf ~ trt + row, data = dat_NH_V3_Inf)
model_v6_nh_root  <- lm(root_wt_inf ~ trt + row, data = dat_NH_V6_Inf)

emm_v3_neb_root <- emmeans(model_v3_neb_root, ~ trt)
emm_v6_neb_root <- emmeans(model_v6_neb_root, ~ trt)
emm_v3_nh_root  <- emmeans(model_v3_nh_root,  ~ trt)
emm_v6_nh_root  <- emmeans(model_v6_nh_root,  ~ trt)

cld_v3_neb_root <- cld(emm_v3_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_root <- cld(emm_v6_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_root  <- cld(emm_v3_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_root  <- cld(emm_v6_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

root_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_root) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_root) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_root)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_root)  %>% mutate(stage = "V6", location = "NH")
) %>%
 dplyr:: rename(root_cld = .group) %>%
 dplyr:: mutate(root_cld = gsub(" ", "", root_cld)) %>%
 dplyr:: select(trt, location, stage, root_cld)

plot_summary <- InF %>%
  dplyr::select(trt, location, stage, row, shoot_wt, root_wt_inf) %>%
  dplyr::group_by(trt, location, stage) %>%
 dplyr:: summarise(
    mean_root  = mean(root_wt_inf, na.rm = TRUE),
    se_root    = sd(root_wt_inf, na.rm = TRUE) / sqrt(sum(!is.na(root_wt_inf))),
    mean_shoot = mean(shoot_wt, na.rm = TRUE),
    se_shoot   = sd(shoot_wt, na.rm = TRUE) / sqrt(sum(!is.na(shoot_wt))),
    .groups = "drop"
  ) %>%
 dplyr:: left_join(shoot_cld_df, by = c("trt", "location", "stage")) %>%
 dplyr:: left_join(root_cld_df,  by = c("trt", "location", "stage"))

plotdata <- plot_summary %>%
 dplyr:: select(trt, location, stage, mean_root, mean_shoot) %>%
  pivot_longer(
    cols = c(mean_root, mean_shoot),
    names_to = "pool",
    values_to = "amount"
  ) %>%
dplyr::  mutate(
    pool = factor(pool,
                  levels = c("mean_root", "mean_shoot"),
                  labels = c("Root", "Shoot"))
  )

# shoot error bars: centered on top of shoot segment
shoot_err <- plot_summary %>%
  dplyr::mutate(
    ymin = mean_shoot - se_shoot,
    ymax = mean_shoot + se_shoot
  )

# root error bars: root segment sits above shoot
root_err <- plot_summary %>%
  dplyr::mutate(
    root_top = mean_shoot + mean_root,
    ymin = root_top - se_root,
    ymax = root_top + se_root
  )

label_df <- plot_summary %>%
  dplyr::group_by(location, stage) %>%
  dplyr::mutate(
    panel_max = max(mean_shoot + mean_root + se_root, na.rm = TRUE),
    
    shoot_lab_y = mean_shoot + se_shoot + 0.06 * panel_max,
    root_lab_y  = mean_shoot + mean_root + se_root + 0.06 * panel_max
  ) %>%
  ungroup()

dodge_amt <- 0.09

p1 <- ggplot(plotdata, aes(x = factor(trt), y = amount, fill = pool)) +
  geom_col(width = 0.60) +
  
  geom_errorbar(
    data = shoot_err,
    aes(
      x = as.numeric(factor(trt)) - dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    inherit.aes = FALSE
  ) +
  
  geom_errorbar(
    data = root_err,
    aes(
      x = as.numeric(factor(trt)) + dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    color= "grey40",
    inherit.aes = FALSE
  ) +
  
  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)) - dodge_amt,
      y = shoot_lab_y,
      label = shoot_cld
    ),
    inherit.aes = FALSE,
    size = 5
  ) +
  
  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)) + dodge_amt,
      y = root_lab_y,
      label = toupper(root_cld)
    ),
    inherit.aes = FALSE,
    size = 3.8,
    color= "grey40"
  ) +
  
  facet_grid(vars(stage), vars(location), scales = "free_y") +
  labs(
    x = "Fertilizer-N treatment",
    y = expression("Crop biomass (kg ha"^{-1}*")"),
    fill = "Component"
  ) +
  scale_fill_manual(
    values = c(
      "Root" = "#D8A24A",
      "Shoot" = "#4A9B83"
    )
  )+
  theme_Manjot() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

p1

#ggsave("cropbiomass.png", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)

Shoot N uptake (Soil vs Fertilizer) graph

#Fertilizer-N in shoot models
model_v3_neb_shoot <- lm(FertN_shoot_kg_ha ~ trt + row, data = dat_Neb_V3)
model_v6_neb_shoot <- lm(FertN_shoot_kg_ha ~ trt + row, data = dat_Neb_V6)
model_v3_nh_shoot  <- lm(FertN_shoot_kg_ha ~ trt + row, data = dat_NH_V3)
model_v6_nh_shoot  <- lm(FertN_shoot_kg_ha ~ trt + row, data = dat_NH_V6)

emm_v3_neb_shoot <- emmeans(model_v3_neb_shoot, ~ trt)
emm_v6_neb_shoot <- emmeans(model_v6_neb_shoot, ~ trt)
emm_v3_nh_shoot  <- emmeans(model_v3_nh_shoot,  ~ trt)
emm_v6_nh_shoot  <- emmeans(model_v6_nh_shoot,  ~ trt)

cld_v3_neb_shoot <- cld(emm_v3_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_shoot <- cld(emm_v6_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_shoot  <- cld(emm_v3_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_shoot  <- cld(emm_v6_nh_shoot,  Letters = letters, alpha = 0.05,  sort= TRUE, reversed= TRUE)

shoot_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_shoot) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_shoot) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_shoot)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_shoot)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr::rename(shoot_cld = .group) %>%
  dplyr::mutate(shoot_cld = gsub(" ", "", shoot_cld)) %>%
  dplyr::select(trt, location, stage, shoot_cld)

# SOM derived shoot N uptake models

model_v3_neb_som <- lm(Ndf_notfert ~ trt + row, data = dat_Neb_V3)
model_v6_neb_som <- lm(Ndf_notfert ~ trt + row, data = dat_Neb_V6)
model_v3_nh_som  <- lm(Ndf_notfert ~ trt + row, data = dat_NH_V3)
model_v6_nh_som  <- lm(Ndf_notfert ~ trt + row, data = dat_NH_V6)

#none of them significant by trt
anova(model_v3_neb_som)
## Analysis of Variance Table
## 
## Response: Ndf_notfert
##           Df  Sum Sq Mean Sq F value Pr(>F)
## trt        5 1.61753 0.32351  2.2357 0.1044
## row        3 0.21087 0.07029  0.4858 0.6972
## Residuals 15 2.17054 0.14470
anova(model_v6_neb_som)
## Analysis of Variance Table
## 
## Response: Ndf_notfert
##           Df  Sum Sq Mean Sq F value Pr(>F)
## trt        5 124.188  24.838  1.5131 0.2443
## row        3  35.878  11.959  0.7285 0.5507
## Residuals 15 246.231  16.415
anova(model_v3_nh_som)
## Analysis of Variance Table
## 
## Response: Ndf_notfert
##           Df  Sum Sq Mean Sq F value Pr(>F)
## trt        5 1.20499 0.24100  1.8566 0.1622
## row        3 0.59304 0.19768  1.5229 0.2493
## Residuals 15 1.94708 0.12981
anova(model_v6_nh_som)
## Analysis of Variance Table
## 
## Response: Ndf_notfert
##           Df  Sum Sq Mean Sq F value Pr(>F)
## trt        5  76.897  15.379  1.5819 0.2288
## row        3  73.044  24.348  2.5044 0.1016
## Residuals 14 136.108   9.722
emm_v3_neb_som <- emmeans(model_v3_neb_som, ~ trt)
emm_v6_neb_som <- emmeans(model_v6_neb_som, ~ trt)
emm_v3_nh_som  <- emmeans(model_v3_nh_som,  ~ trt)
emm_v6_nh_som  <- emmeans(model_v6_nh_som,  ~ trt)

cld_v3_neb_som <- cld(emm_v3_neb_som, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_som <- cld(emm_v6_neb_som, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_som  <- cld(emm_v3_nh_som,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_som  <- cld(emm_v6_nh_som,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

som_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_som) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_som) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_som)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_som)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr:: rename(som_cld = .group) %>%
  dplyr:: mutate(som_cld = gsub(" ", "", som_cld)) %>%
  dplyr:: select(trt, location, stage, som_cld)

plot_summary <- data_new %>%
  dplyr::select(trt, location, stage, row, FertN_shoot_kg_ha, Ndf_notfert) %>%
  dplyr::group_by(trt, location, stage) %>%
  dplyr:: summarise(
    mean_SOM  = mean(Ndf_notfert, na.rm = TRUE),
    se_SOM   = sd(Ndf_notfert, na.rm = TRUE) / sqrt(sum(!is.na(Ndf_notfert))),
    mean_shoot = mean(FertN_shoot_kg_ha, na.rm = TRUE),
    se_shoot   = sd(FertN_shoot_kg_ha, na.rm = TRUE) / sqrt(sum(!is.na(FertN_shoot_kg_ha))),
    .groups = "drop"
  ) %>%
  left_join(shoot_cld_df, by = c("trt", "location", "stage")) %>%
  left_join(som_cld_df,  by = c("trt", "location", "stage"))

plotdata <- plot_summary %>%
  dplyr:: select(trt, location, stage, mean_SOM, mean_shoot) %>%
  pivot_longer(
    cols = c(mean_shoot, mean_SOM),
    names_to = "pool",
    values_to = "amount"
  ) %>%
  dplyr::  mutate(
    pool = factor(pool,
                  levels = c("mean_shoot", "mean_SOM"),
                  labels = c("Fertilizer-N", "Soil-derived N"))
  )

# shoot error bars: centered on top of shoot segment
SOM_err <- plot_summary %>%
  dplyr::mutate(
    ymin = mean_SOM - se_SOM,
    ymax = mean_SOM + se_SOM
  )

# root error bars: root segment sits above shoot
shoot_err <- plot_summary %>%
  dplyr::mutate(
    shoot_top = mean_shoot + mean_SOM,
    ymin = shoot_top - se_shoot,
    ymax = shoot_top + se_shoot
  )

label_df <- plot_summary %>%
  dplyr::group_by(location, stage) %>%
  dplyr::mutate(
    panel_max = max(mean_shoot + mean_SOM + se_shoot, na.rm = TRUE),
    
    SOM_lab_y = mean_SOM + se_SOM + 0.06 * panel_max,
    shoot_lab_y  = mean_shoot + mean_SOM + se_shoot + 0.06 * panel_max
  ) %>%
  ungroup()

dodge_amt <- 0.08

p1<-ggplot(plotdata, aes(x = factor(trt), y = amount, fill = pool)) +
  geom_col(width = 0.60) +
  
  geom_errorbar(
    data = SOM_err,
    aes(
      x = as.numeric(factor(trt)) + dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    inherit.aes = FALSE
  ) +
  geom_errorbar(
    data = shoot_err,
    aes(
      x = as.numeric(factor(trt)) - dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    inherit.aes = FALSE
  ) +
  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)) - dodge_amt,
      y = shoot_lab_y,
      label = shoot_cld
    ),
        inherit.aes = FALSE,
    size = 5
  ) +
  
  facet_grid(vars(stage), vars(location), scales = "free_y") +
  labs(
    x = "Fertilizer-N treatment",
    y = expression("Shoot N uptake (kg N ha"^{-1}*")"),
    fill = "Source of N"
  )  +
  scale_fill_manual(
    values = c(
      "Fertilizer-N" = "#68AEDF",  # blue
      "Soil-derived N"        = "#CC9352"   # medium gray
    )
  )+
  theme_Manjot() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
p1

#ggsave("shootNuptakeexp2.png", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)

Regression shoot N uptake graph

#  Reshape data
plotdata_long <- dat_V6 %>%
  pivot_longer(cols = c(Ndf_notfert, FertN_shoot_kg_ha),
               names_to = "source",
               values_to = "shoot_N_uptake") %>%
  dplyr::mutate(
    source = recode(source,
                    "Ndf_notfert" = "Soil-derived N",
                    "FertN_shoot_kg_ha" = "Fertilizer-N")
  )

# Plot with per-facet regressions handled by ggpmisc
p1<-ggplot(plotdata_long, aes(x = totN_applied_kgha,
                          y = shoot_N_uptake,
                          color = source, shape=source)) +
  
 
  # Linear for SOM-N
  geom_smooth(
    data = subset(plotdata_long, source == "Soil-derived N"),
    aes(group = interaction(source, location)),
    method = "lm", formula = y ~ x, se = TRUE, alpha=0.20, fill= "#CC9352"
  ) +
  
  # Linear for Fertilizer-N
  geom_smooth(
    data = subset(plotdata_long, source == "Fertilizer-N"),
    aes(group = interaction(source, location)),
    method = "lm", formula = y ~ x, se = TRUE, alpha= 0.20, fill= "#68AEDF"
  ) +
  
  geom_point(size=2.5, stroke=1) +
  
  # Linear equations for SOM-N
  stat_poly_eq(
    data = subset(plotdata_long, source == "Soil-derived N"),
    aes(group = interaction(source, location),
        label = after_stat(
          paste( rr.label, p.value.label, sep = "*', '*")
        )),
    formula = y ~ x, parse = TRUE,
    geom = "label_npc", label.x = "left", label.y = 0.95,
    vstep = 0.12, size = 4.5
  ) +
  
  # Linear equations for Fertilizer-N
  stat_poly_eq(
    data = subset(plotdata_long, source == "Fertilizer-N"),
    aes(group = interaction(source, location),
        label = after_stat(
          paste( rr.label, p.value.label, sep = "*', '*")
        )),
    formula = y ~ x, parse = TRUE,
    geom = "label_npc", label.x = "left", label.y = 0.88,
    vstep = 0.12, size = 4.5
  ) +
  
  facet_wrap(~ location, ncol = 2,
             labeller = as_labeller(c(NE = "NE", NH = "NH")))+
  scale_color_manual(values = c("Soil-derived N" = "#CC9352",
                                "Fertilizer-N" = "#6BAEDF"))  +
  scale_fill_manual(
    values = c(
      "Soil-derived N" = "#CC9352",
      "Fertilizer-N" = "#6BAEDF"
    ))+
  
  scale_shape_manual(values = c("Soil-derived N" = 16,
                                "Fertilizer-N" = 17)) +
  labs(
    x = expression("Fertilizer Rate (kg N " ~ha^{-1} ~ ")"),
    y = expression("Shoot N Uptake (kg N " ~ha^{-1} ~ ")"),
    color = "Source of N", shape= "Source of N"
  )  +
  theme_Manjot()+
theme(
  axis.text  = element_text(size = 15)
)
p1
## Warning: Removed 49 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Removed 49 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 49 rows containing non-finite outside the scale range
## (`stat_poly_eq()`).
## Removed 49 rows containing non-finite outside the scale range
## (`stat_poly_eq()`).
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's fill values.
## Warning: Removed 98 rows containing missing values or values outside the scale range
## (`geom_point()`).

ggsave("NsourceAexp2.jpg", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)
## Warning: Removed 49 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 49 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 49 rows containing non-finite outside the scale range
## (`stat_poly_eq()`).
## Removed 49 rows containing non-finite outside the scale range
## (`stat_poly_eq()`).
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's fill values.
## Warning: Removed 98 rows containing missing values or values outside the scale range
## (`geom_point()`).

15N recovery graph

plotdata <- InF %>%
  dplyr::select(
    trt, location, stage, row,
    per_Recov_wholesoil_tot,
    perRecov_shoot,
    perRecov_root
  ) %>%
 dplyr:: group_by(trt, location, stage) %>%
 dplyr:: summarise(
    Root = mean(perRecov_root, na.rm = TRUE),
    Shoot = mean(perRecov_shoot, na.rm = TRUE),
    `Whole soil` = mean(per_Recov_wholesoil_tot, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  pivot_longer(
    cols = c(Root, Shoot, `Whole soil`),
    names_to = "pool",
    values_to = "amount"
  ) %>%
dplyr::  mutate(
    pool = factor(
      pool,
      levels = c("Root", "Shoot", "Whole soil")
    )
  )

p1 <- ggplot(
  plotdata,
  aes(x = factor(trt), y = amount, fill = pool)
) +
  geom_col(
    position = "stack",
    width = 0.60
  ) +
  facet_grid(
    vars(stage),
    vars(location),
    scales = "free_y"
  ) +
  labs(
    x = "Fertilizer treatment",
    y = expression({}^{15}*"N recovery (%)"),
    fill = "Pools"
  ) +
  scale_fill_manual(
    values = c(
      "Root"       = "#D8A24A",
      "Shoot"      = "#4A9B83",
      "Whole soil" = "#8C78A8"
    )
  ) +
  theme_Manjot() +
  theme(
    axis.text = element_text(size = 15),
    axis.text.x = element_text(
      angle = 45,
      hjust = 1
    ),
    axis.title = element_text(size = 16)
  )

p1

ggsave("15Nrecovery_npj.jpg", p1, device = ragg::agg_png, width = 10, height = 8, units = "in", dpi = 300)

15N recovery in soil pools graph

plotdata <- data_new %>%
  dplyr::select(
    trt, location, stage, row,
    per_Recov_MAOM_tot,
    per_Recov_TDN_tot,
    per_Recov_MBN_tot
  ) %>%
  
dplyr::  group_by(trt, location, stage) %>%
  
 dplyr:: summarise(
    mean_maomrec = mean(per_Recov_MAOM_tot, na.rm = TRUE),
    mean_mbnrec  = mean(per_Recov_MBN_tot, na.rm = TRUE),
    mean_tdnrec  = mean(per_Recov_TDN_tot, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  
  pivot_longer(
    cols = c(mean_maomrec, mean_mbnrec, mean_tdnrec),
    names_to = "pool",
    values_to = "amount"
  ) %>%
  
 dplyr:: mutate(
    pool = factor(
      pool,
      levels = c(
        "mean_maomrec",
        "mean_mbnrec",
        "mean_tdnrec"
      )
    )
  )

axis_caps <- plotdata %>%
  dplyr::distinct(stage, location) %>%
  dplyr::mutate(
    trt = dplyr::first(plotdata$trt),
    amount = dplyr::if_else(stage == "V3", 110, 60)
  )

p1 <- ggplot(
  plotdata,
  aes(
    x = factor(trt),
    y = amount,
    fill = pool
  )
) +
  
  geom_col(
    position = "stack",
    width = 0.60,
    linewidth = 0.25
  ) +
  
  facet_grid(
    vars(stage),
    vars(location),
    scales = "free_y"
  ) +
  
  scale_fill_manual(
    values = c(
      "mean_maomrec" = "#8E5A8A",  # warm purple
      "mean_mbnrec"  = "#C48FB3",  # light warm purple
      "mean_tdnrec"  = "#6678B8"   # cool blue-purple
    ),
    breaks = c(
      "mean_maomrec",
      "mean_mbnrec",
      "mean_tdnrec"
    ),
    labels = c(
      "MAOM",
      "MBN",
      "TDN"
    )
  ) +
  # Invisible points force V3 to 90 and V6 to 60
  geom_blank(
    data = axis_caps,
    aes(
      x = factor(trt),
      y = amount
    ),
    inherit.aes = FALSE
  ) +
  
  labs(
    x = "Fertilizer treatment",
    y = expression({}^{15}*"N recovery (%)"),
    fill = "Soil pools")+
  theme_Manjot() +
  
  theme(
    axis.text = element_text(size = 15),
    axis.text.x = element_text(
      angle = 45,
      hjust = 1
    ),
    axis.title = element_text(size = 16),
    legend.title = element_text(size = 15),
    legend.text = element_text(size = 14)
  )

p1

#ggsave("recoverysoilpool2.jpg", p1, device = ragg::agg_png, width = 10, height = 8, units = "in", dpi = 300)

Ndff in MAOM graph

#MAOM band model
model_v3_neb_maom <- lm(kgN_dff_MAOM_ha ~ trt + row, data = dat_Neb_V3_Band)
model_v6_neb_maom <- lm(kgN_dff_MAOM_ha~ trt + row, data = dat_Neb_V6_Band)
model_v3_nh_maom  <- lm(kgN_dff_MAOM_ha~ trt + row, data = dat_NH_V3_Band)
model_v6_nh_maom  <- lm(kgN_dff_MAOM_ha~ trt + row, data = dat_NH_V6_Band)

emm_v3_neb_maom <- emmeans(model_v3_neb_maom, ~ trt)
emm_v6_neb_maom <- emmeans(model_v6_neb_maom, ~ trt)
emm_v3_nh_maom  <- emmeans(model_v3_nh_maom,  ~ trt)
emm_v6_nh_maom  <- emmeans(model_v6_nh_maom,  ~ trt)

cld_v3_neb_maom <- cld(emm_v3_neb_maom, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_maom <- cld(emm_v6_neb_maom, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_maom  <- cld(emm_v3_nh_maom,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_maom  <- cld(emm_v6_nh_maom,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)


#-----------------------------
# MAOM furrow models
#-----------------------------
model_v3_neb_furrow <- lm(kgN_dff_MAOM_ha ~ trt + row, data= dat_Neb_V3_Inf)
model_v6_neb_furrow <- lm(kgN_dff_MAOM_ha~ trt + row, data = dat_Neb_V6_Inf)
model_v3_nh_furrow  <- lm(kgN_dff_MAOM_ha ~ trt + row, data = dat_NH_V3_Inf)
model_v6_nh_furrow  <- lm(kgN_dff_MAOM_ha ~ trt + row, data = dat_NH_V6_Inf)

emm_v3_neb_furrow <- emmeans(model_v3_neb_furrow, ~ trt)
emm_v6_neb_furrow <- emmeans(model_v6_neb_furrow, ~ trt)
emm_v3_nh_furrow  <- emmeans(model_v3_nh_furrow,  ~ trt)
emm_v6_nh_furrow  <- emmeans(model_v6_nh_furrow,  ~ trt)

cld_v3_neb_furrow <- cld(emm_v3_neb_furrow, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_furrow <- cld(emm_v6_neb_furrow, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_furrow  <- cld(emm_v3_nh_furrow,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_furrow  <- cld(emm_v6_nh_furrow,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

# Combine significance letters for Band and Furrow

cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_maom) %>%
    dplyr::mutate(stage = "V3", location = "NE", position = "Band"),

  as.data.frame(cld_v6_neb_maom) %>%
      dplyr::mutate(stage = "V6", location = "NE", position = "Band"),

  as.data.frame(cld_v3_nh_maom) %>%
      dplyr::mutate(stage = "V3", location = "NH", position = "Band"),

  as.data.frame(cld_v6_nh_maom) %>%
      dplyr::mutate(stage = "V6", location = "NH", position = "Band"),

  as.data.frame(cld_v3_neb_furrow) %>%
      dplyr::mutate(stage = "V3", location = "NE", position = "Furrow"),

  as.data.frame(cld_v6_neb_furrow) %>%
     dplyr:: mutate(stage = "V6", location = "NE", position = "Furrow"),

  as.data.frame(cld_v3_nh_furrow) %>%
      dplyr::mutate(stage = "V3", location = "NH", position = "Furrow"),

  as.data.frame(cld_v6_nh_furrow) %>%
     dplyr:: mutate(stage = "V6", location = "NH", position = "Furrow")
) %>%
  dplyr::transmute(
    trt = as.character(trt),
    location,
    stage,
    position,
    cld = gsub("\\s+", "", .group)
  )

# Treatment order
trt_levels <- c(
  "InF-5", "InF-10", "UAN-74",
  "Both-79", "UAN-148", "Both-158"
)

# Standardize position labels in CLD data
cld_df <- cld_df %>%
  dplyr::mutate(
    trt = trimws(as.character(trt)),
    location = as.character(location),
    stage = as.character(stage),
    position = trimws(as.character(position))
  )

# Summarize MAOM by treatment, location, stage, and position
plotdata <- data_new %>%
  dplyr::mutate(
    trt = trimws(as.character(trt)),
    location = as.character(location),
    stage = as.character(stage),

    position = dplyr::case_when(
      trimws(as.character(position)) %in%
        c("In-row", "Furrow", "InF") ~ "Furrow",
      trimws(as.character(position)) == "Band" ~ "Band",
      TRUE ~ NA_character_
    )
  ) %>%
  dplyr::filter(
    !is.na(position),
    !is.na(kgN_dff_MAOM_ha)
  ) %>%
  dplyr::group_by(trt, location, stage, position) %>%
  dplyr::summarise(
    mean_maom = mean(kgN_dff_MAOM_ha),

    se_maom = if (dplyr::n() > 1) {
      sd(kgN_dff_MAOM_ha) / sqrt(dplyr::n())
    } else {
      NA_real_
    },

    .groups = "drop"
  ) %>%

  # Join significance letters AFTER standardizing position
  dplyr::left_join(
    cld_df,
    by = c("trt", "location", "stage", "position")
  ) %>%

  dplyr::mutate(
    trt = factor(trt, levels = trt_levels),
    position = factor(
      position,
      levels = c("Band", "Furrow")
    )
  ) %>%

  # Calculate significance letter heights
  dplyr::group_by(location, stage) %>%
  dplyr::mutate(
    panel_max = max(
      mean_maom + dplyr::coalesce(se_maom, 0),
      na.rm = TRUE
    ),

    label_y = mean_maom +
      dplyr::coalesce(se_maom, 0) +
      dplyr::if_else(
        position == "Furrow",
        0.10 * max(panel_max, 1),
        0.06 * max(panel_max, 1)
      )
  ) %>%
  dplyr::ungroup()


# Error bars
error_df <- plotdata %>%
  dplyr::mutate(
    ymin = mean_maom - se_maom,
    ymax = mean_maom + se_maom
  )

# Significance letters
label_long <- plotdata %>%
  dplyr::select(
    trt, location, stage, position,
    label_y, cld
  )

# Identical dodge for all layers
dodge_position <- ggplot2::position_dodge(width = 0.75)


# Plot
p1 <- ggplot2::ggplot(
  plotdata,
  ggplot2::aes(
    x = trt,
    y = mean_maom,
    fill = position,
    group = position
  )
) +

  # Bars
  ggplot2::geom_col(
    position = dodge_position,
    width = 0.60
  ) +

  # Error bars
  ggplot2::geom_errorbar(
    data = error_df,
    ggplot2::aes(
      x = trt,
      ymin = ymin,
      ymax = ymax,
      group = position
    ),
    position = dodge_position,
    width = 0.08,
    linewidth = 0.5,
    color = "grey20",
    inherit.aes = FALSE,
    na.rm = TRUE
  ) +

  # Significance letters
  ggplot2::geom_text(
    data = label_long,
    ggplot2::aes(
      x = trt,
      y = label_y,
      label = cld,
      group = position
    ),
    position = dodge_position,
    inherit.aes = FALSE,
    size = 5,
    color = "grey15",
    na.rm = TRUE
  ) +

  ggplot2::facet_grid(
    ggplot2::vars(stage),
    ggplot2::vars(location),
    scales = "free_y"
  ) +

  ggplot2::scale_fill_manual(
    values = c(
      "Band" = "#8E5A8A",
      "Furrow" = "#6678B8"
    ),
    breaks = c("Band", "Furrow")
  ) +

  ggplot2::labs(
    x = "Fertilizer-N treatment",
    y = expression(
      "Amount Ndff in MAOM (kg N ha"^{-1} * ")"
    ),
    fill = "Position"
  ) +

  theme_Manjot() +

  ggplot2::theme(
    axis.text = ggplot2::element_text(size = 15),
    axis.text.x = ggplot2::element_text(
      angle = 45,
      hjust = 1
    ),
    axis.title = ggplot2::element_text(size = 16),
    legend.title = ggplot2::element_text(size = 16),
    legend.text = ggplot2::element_text(size = 15)
  )

p1

ggsave("MAOMdffexp2.jpg", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)

% recovery in MAOM graph

# Fit separate models for each site x stage
#-----------------------------
model_v3_neb_maom <- lm(per_Recov_MAOM_tot ~ trt + row, data = dat_Neb_V3)
model_v6_neb_maom <- lm(per_Recov_MAOM_tot ~ trt + row, data = dat_Neb_V6)
model_v3_nh_maom  <- lm(per_Recov_MAOM_tot ~ trt  + row, data = dat_NH_V3)
model_v6_nh_maom  <- lm(per_Recov_MAOM_tot ~ trt  + row, data = dat_NH_V6)

#-----------------------------
# emmeans: compare trt
#-----------------------------
emm_v3_neb_maom <- emmeans(model_v3_neb_maom, ~ trt )
emm_v6_neb_maom <- emmeans(model_v6_neb_maom, ~ trt )
emm_v3_nh_maom  <- emmeans(model_v3_nh_maom,  ~ trt )
emm_v6_nh_maom  <- emmeans(model_v6_nh_maom,  ~ trt )

#-----------------------------

# CLD letters
#-----------------------------
cld_v3_neb_maom <- cld(emm_v3_neb_maom, Letters = letters, alpha = 0.05, sort=TRUE, reversed=TRUE)
cld_v6_neb_maom <- cld(emm_v6_neb_maom, Letters = letters, alpha = 0.05,sort=TRUE, reversed=TRUE)
cld_v3_nh_maom  <- cld(emm_v3_nh_maom,  Letters = letters, alpha = 0.05,sort=TRUE, reversed=TRUE)
cld_v6_nh_maom  <- cld(emm_v6_nh_maom,  Letters = letters, alpha = 0.05,sort=TRUE, reversed=TRUE)

#-----------------------------
# Convert CLD results to dataframes
#-----------------------------
maom_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_maom) %>% dplyr::mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_maom) %>% dplyr::mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_maom)  %>% dplyr::mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_maom)  %>% dplyr::mutate(stage = "V6", location = "NH")
) %>%
  dplyr::rename(maom_cld = .group) %>%
  dplyr::mutate(maom_cld = gsub(" ", "", maom_cld)) %>%
  dplyr::select(trt, location, stage, maom_cld)


label_df <- data_new %>%
  dplyr::filter(stage %in% c("V3", "V6")) %>%
  dplyr::group_by(location, stage, trt) %>%
  dplyr::summarise(
    y_pos = boxplot.stats(per_Recov_MAOM_tot)$stats[5],  # upper whisker
    .groups = "drop"
  ) %>%
  left_join(maom_cld_df, by = c("trt", "location", "stage")) %>%
  dplyr::group_by(location, stage) %>%
  dplyr::mutate(
    panel_max = max(y_pos, na.rm = TRUE),
    y_pos = y_pos + 0.1 * panel_max
  ) %>%
  ungroup()

ggplot(data_new %>% dplyr::filter(stage %in% c("V3", "V6")),
       aes(x = trt, y = per_Recov_MAOM_tot)) +
  geom_boxplot(width = 0.6) +
  facet_grid(vars(stage), vars(location), scales = "free") +
  geom_text(
    data = label_df,
    aes(x = trt, y = y_pos, label = maom_cld),
    position = position_dodge(width = 0.8),
    inherit.aes = FALSE,
    size = 5
  ) +
  theme_Manjot() +
  labs(
        x = "Fertilizer treatment",
        y = "% recovery in MAOM",
        title = "Recovery in MAOM"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Removed 96 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

## Total N in crop biomass graph

model_v3_neb_shoot <- lm(totN_shoot_kgha ~ trt + row, data = dat_Neb_V3)
model_v6_neb_shoot <- lm(totN_shoot_kgha  ~ trt + row, data = dat_Neb_V6)
model_v3_nh_shoot  <- lm(totN_shoot_kgha  ~ trt + row, data = dat_NH_V3)
model_v6_nh_shoot  <- lm(totN_shoot_kgha ~ trt + row, data = dat_NH_V6)

emm_v3_neb_shoot <- emmeans(model_v3_neb_shoot, ~ trt)
emm_v6_neb_shoot <- emmeans(model_v6_neb_shoot, ~ trt)
emm_v3_nh_shoot  <- emmeans(model_v3_nh_shoot,  ~ trt)
emm_v6_nh_shoot  <- emmeans(model_v6_nh_shoot,  ~ trt)

cld_v3_neb_shoot <- cld(emm_v3_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_shoot <- cld(emm_v6_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_shoot  <- cld(emm_v3_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_shoot  <- cld(emm_v6_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

shoot_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_shoot) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_shoot) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_shoot)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_shoot)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr::rename(shoot_cld = .group) %>%
  dplyr::mutate(shoot_cld = gsub(" ", "", shoot_cld)) %>%
  dplyr::select(trt, location, stage, shoot_cld)

#-----------------------------
# ROOT models
#-----------------------------
model_v3_neb_root <- lm(totN_root_kgha ~ trt + row, data = dat_Neb_V3_Inf)
model_v6_neb_root <- lm(totN_root_kgha  ~ trt + row, data = dat_Neb_V6_Inf)
model_v3_nh_root  <- lm(totN_root_kgha  ~ trt + row, data = dat_NH_V3_Inf)
model_v6_nh_root  <- lm(totN_root_kgha  ~ trt + row, data = dat_NH_V6_Inf)

emm_v3_neb_root <- emmeans(model_v3_neb_root, ~ trt)
emm_v6_neb_root <- emmeans(model_v6_neb_root, ~ trt)
emm_v3_nh_root  <- emmeans(model_v3_nh_root,  ~ trt)
emm_v6_nh_root  <- emmeans(model_v6_nh_root,  ~ trt)

cld_v3_neb_root <- cld(emm_v3_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_root <- cld(emm_v6_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_root  <- cld(emm_v3_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_root  <- cld(emm_v6_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

root_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_root) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_root) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_root)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_root)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr:: rename(root_cld = .group) %>%
  dplyr:: mutate(root_cld = gsub(" ", "", root_cld)) %>%
  dplyr:: select(trt, location, stage, root_cld)

plot_summary <- InF %>%
  dplyr::select(trt, location, stage, row, totN_shoot_kgha, totN_root_kgha ) %>%
  dplyr::group_by(trt, location, stage) %>%
  dplyr:: summarise(
    mean_root  = mean(totN_root_kgha, na.rm = TRUE),
    se_root    = sd(totN_root_kgha, na.rm = TRUE) / sqrt(sum(!is.na(totN_root_kgha))),
    mean_shoot = mean(totN_shoot_kgha, na.rm = TRUE),
    se_shoot   = sd(totN_shoot_kgha, na.rm = TRUE) / sqrt(sum(!is.na(totN_shoot_kgha))),
    .groups = "drop"
  ) %>%
  left_join(shoot_cld_df, by = c("trt", "location", "stage")) %>%
  left_join(root_cld_df,  by = c("trt", "location", "stage"))

plotdata <- plot_summary %>%
  dplyr:: select(trt, location, stage, mean_root, mean_shoot) %>%
  pivot_longer(
    cols = c(mean_root, mean_shoot),
    names_to = "pool",
    values_to = "amount"
  ) %>%
  dplyr::  mutate(
    pool = factor(pool,
                  levels = c("mean_root", "mean_shoot"),
                  labels = c("Root", "Shoot"))
  )

# shoot error bars: centered on top of shoot segment
shoot_err <- plot_summary %>%
  dplyr::mutate(
    ymin = mean_shoot - se_shoot,
    ymax = mean_shoot + se_shoot
  )

# root error bars: root segment sits above shoot
root_err <- plot_summary %>%
  dplyr::mutate(
    root_top = mean_shoot + mean_root,
    ymin = root_top - se_root,
    ymax = root_top + se_root
  )

label_df <- plot_summary %>%
  dplyr::group_by(location, stage) %>%
  dplyr::mutate(
    panel_max = max(mean_shoot + mean_root + se_root, na.rm = TRUE),
    
    shoot_lab_y = mean_shoot + se_shoot + 0.06 * panel_max,
    root_lab_y  = mean_shoot + mean_root + se_root + 0.06 * panel_max
  ) %>%
  ungroup()

p1 <- ggplot(plotdata, aes(x = factor(trt), y = amount, fill = pool)) +
  geom_col(width = 0.60) +
  
  geom_errorbar(
    data = shoot_err,
    aes(
      x = as.numeric(factor(trt)) - dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    inherit.aes = FALSE
  ) +
  
  geom_errorbar(
    data = root_err,
    aes(
      x = as.numeric(factor(trt)) + dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    color= "grey40",
    inherit.aes = FALSE
  ) +
  
  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)) - dodge_amt,
      y = shoot_lab_y,
      label = shoot_cld
    ),
    inherit.aes = FALSE,
    size = 5
  ) +
  
  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)) + dodge_amt,
      y = root_lab_y,
      label = toupper(root_cld)
    ),
    inherit.aes = FALSE,
    size = 3.8,
    color= "grey40"
  ) +
  
  facet_grid(vars(stage), vars(location), scales = "free_y") +
  labs(
    x = "Fertilizer-N treatment",
    y = expression("Total N in crop biomass (kg ha"^{-1}*")"),
    fill = "Component"
  ) +
  scale_fill_manual(
    values = c(
      "Root" = "#D8A24A",
      "Shoot" = "#4A9B83"
    )
  )+
  theme_Manjot() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
p1

ggsave("TotNcropbiomass.png", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)

Mean %15N recovery of all pools (table)

table_recovery <- InF%>%
  pivot_longer(
    cols = c(
      perRecov_shoot,
      perRecov_root,
      per_Recov_MBN_tot,
      per_Recov_MAOM_tot,
      per_Recov_TDN_tot,
      per_Recov_wholesoil_tot
    ),
    names_to = "pool",
    values_to = "recovery"
  ) %>%
  dplyr::mutate(
    pool = recode(pool,
                  perRecov_shoot = "Shoot",
                  perRecov_root = "Root",
                  per_Recov_MBN_tot = "MBN",
                  per_Recov_MAOM_tot= "MAOM",
                  per_Recov_TDN_tot = "TDN",
                  per_Recov_wholesoil_tot = "Whole soil"
    )
  ) %>%
  dplyr::group_by(trt, stage, location, pool) %>%
  dplyr::summarise(
    n = sum(!is.na(recovery)),
    mean = mean(recovery, na.rm = TRUE),
    se = sd(recovery, na.rm = TRUE) / sqrt(n),
    .groups = "drop"
  ) %>%
  dplyr:: mutate(
    value = sprintf("%.1f (%.1f)", mean, se)
  ) %>%
  dplyr::select(trt, stage, location, pool, value) %>%
  pivot_wider(
    names_from = pool,
    values_from = value
  )

View(table_recovery)

recovery_long <- InF %>%
  tidyr::pivot_longer(
    cols = c(
      perRecov_shoot,
      perRecov_root,
      per_Recov_MBN_tot,
      per_Recov_MAOM_tot,
      per_Recov_TDN_tot,
      per_Recov_wholesoil_tot
    ),
    names_to = "pool",
    values_to = "recovery"
  ) %>%
  dplyr::mutate(
    pool = dplyr::recode(
      pool,
      perRecov_shoot = "Shoot",
      perRecov_root = "Root",
      per_Recov_MBN_tot = "MBN",
      per_Recov_MAOM_tot = "MAOM",
      per_Recov_TDN_tot = "TDN",
      per_Recov_wholesoil_tot = "Whole soil"
    ),
    trt = factor(trt),
    row = factor(row)
  )

recovery_cld <- recovery_long %>%
  dplyr::filter(
    !is.na(recovery),
    !is.na(trt),
    !is.na(row)
  ) %>%
  dplyr::group_by(location, stage, pool) %>%
  dplyr::group_modify(~ {

    model <- lm(
      recovery ~ trt + row,
      data = .x
    )

    emm <- emmeans::emmeans(model, ~ trt)

    cld_result <- multcomp::cld(
      emm,
      Letters = letters,
      alpha = 0.05,
      sort = TRUE,
      reversed = TRUE
    )

    data.frame(
      trt = as.character(cld_result$trt),
      cld = gsub("\\s+", "", cld_result$.group)
    )

  }) %>%
  dplyr::ungroup()

table_recovery <- recovery_long %>%
  dplyr::group_by(trt, stage, location, pool) %>%
  dplyr::summarise(
    n = sum(!is.na(recovery)),
    mean = mean(recovery, na.rm = TRUE),
    se = sd(recovery, na.rm = TRUE) / sqrt(n),
    .groups = "drop"
  ) %>%
  dplyr::mutate(
    trt = as.character(trt)
  ) %>%
  dplyr::left_join(
    recovery_cld,
    by = c("trt", "stage", "location", "pool")
  ) %>%
  dplyr::mutate(
    value = dplyr::case_when(
      n > 1 ~ sprintf("%.1f (%.1f)", mean, se),
      n == 1 ~ sprintf("%.1f (NA)", mean),
      TRUE ~ NA_character_
    ),
    value = dplyr::if_else(
      !is.na(cld) & !is.na(value),
      paste0(value, " ", cld),
      value
    )
  ) %>%
  dplyr::select(
    trt, stage, location, pool, value
  ) %>%
  tidyr::pivot_wider(
    names_from = pool,
    values_from = value
  )

table_recovery
## # A tibble: 24 × 9
##    trt    stage location MAOM          MBN        Root  Shoot TDN   `Whole soil`
##    <chr>  <fct> <fct>    <chr>         <chr>      <chr> <chr> <chr> <chr>       
##  1 InF-5  V3    NE       23.4 (3.6) a  0.3 (0.1)… 3.1 … 13.3… 0.4 … 44.5 (20.5)…
##  2 InF-5  V3    NH       59.1 (11.5) a 0.4 (0.1)… 3.8 … 17.5… 0.3 … 87.5 (3.5) a
##  3 InF-5  V6    NE       11.3 (1.0) a  0.0 (0.0)… 1.5 … 22.0… 0.0 … 13.3 (1.6) a
##  4 InF-5  V6    NH       23.3 (2.8) a  0.1 (0.0)… 5.8 … 20.8… 0.1 … 35.3 (2.1) a
##  5 InF-10 V3    NE       15.7 (1.2) ab 0.1 (0.0)… 3.9 … 15.7… 0.5 … 42.0 (8.3) a
##  6 InF-10 V3    NH       27.8 (6.2) b  0.4 (0.2)… 3.6 … 14.9… 0.7 … 61.2 (2.7) b
##  7 InF-10 V6    NE       5.9 (0.5) ab  0.0 (0.0)… 2.5 … 24.0… 0.0 … 8.3 (1.0) a 
##  8 InF-10 V6    NH       16.8 (6.4) ab 0.1 (0.0)… 5.7 … 24.9… 0.1 … 21.4 (3.2) a
##  9 UAN-74 V3    NE       9.5 (3.2) b   0.2 (0.2)… 0.2 … 1.0 … 7.3 … 37.3 (6.4) a
## 10 UAN-74 V3    NH       12.3 (1.7) b  3.5 (1.4)… 0.1 … 0.3 … 15.5… 56.2 (7.1) b
## # ℹ 14 more rows
knitr::kable(
  table_recovery,
  format = "html",
  caption = "Fertilizer-N recovery (%) across soil and plant pools"
)
Fertilizer-N recovery (%) across soil and plant pools
trt stage location MAOM MBN Root Shoot TDN Whole soil
InF-5 V3 NE 23.4 (3.6) a 0.3 (0.1) a 3.1 (0.5) a 13.3 (1.9) a 0.4 (0.1) b 44.5 (20.5) a
InF-5 V3 NH 59.1 (11.5) a 0.4 (0.1) a 3.8 (0.7) a 17.5 (3.5) a 0.3 (0.1) d 87.5 (3.5) a
InF-5 V6 NE 11.3 (1.0) a 0.0 (0.0) a 1.5 (0.2) ab 22.0 (6.4) a 0.0 (0.0) b 13.3 (1.6) a
InF-5 V6 NH 23.3 (2.8) a 0.1 (0.0) a 5.8 (1.3) a 20.8 (5.1) a 0.1 (0.0) c 35.3 (2.1) a
InF-10 V3 NE 15.7 (1.2) ab 0.1 (0.0) a 3.9 (1.0) a 15.7 (1.6) a 0.5 (0.2) b 42.0 (8.3) a
InF-10 V3 NH 27.8 (6.2) b 0.4 (0.2) a 3.6 (0.3) a 14.9 (1.3) a 0.7 (0.2) d 61.2 (2.7) b
InF-10 V6 NE 5.9 (0.5) ab 0.0 (0.0) a 2.5 (0.4) a 24.0 (3.5) a 0.0 (0.0) b 8.3 (1.0) a
InF-10 V6 NH 16.8 (6.4) ab 0.1 (0.0) a 5.7 (0.8) a 24.9 (3.6) a 0.1 (0.0) c 21.4 (3.2) a
UAN-74 V3 NE 9.5 (3.2) b 0.2 (0.2) a 0.2 (0.1) b 1.0 (0.5) b 7.3 (2.9) ab 37.3 (6.4) a
UAN-74 V3 NH 12.3 (1.7) b 3.5 (1.4) a 0.1 (0.0) b 0.3 (0.1) b 15.5 (2.3) bc 56.2 (7.1) b
UAN-74 V6 NE 3.7 (0.5) b 0.0 (0.0) a 0.6 (0.2) bc 23.4 (3.8) a 0.1 (0.0) ab 9.9 (1.0) a
UAN-74 V6 NH 7.0 (1.7) b 3.2 (3.2) a 0.8 (0.3) b 5.5 (2.9) b 2.5 (0.8) bc 25.2 (4.9) a
Both-79 V3 NE 13.5 (2.3) ab 1.5 (1.0) a 0.4 (0.1) b 1.8 (0.4) b 12.4 (2.8) a 30.4 (2.6) a
Both-79 V3 NH 10.4 (1.6) b 3.6 (2.1) a 0.3 (0.1) b 1.5 (0.4) b 29.1 (5.9) a 43.6 (4.7) b
Both-79 V6 NE 5.2 (1.5) ab 0.8 (0.6) a 0.7 (0.1) bc 15.1 (3.7) a 2.6 (0.9) a 14.1 (3.9) a
Both-79 V6 NH 10.9 (1.2) ab 0.6 (0.6) a 0.6 (0.1) b 5.1 (1.5) b 17.5 (2.6) a 35.6 (5.1) a
UAN-148 V3 NE 9.8 (3.2) b 0.3 (0.2) a 0.2 (0.0) b 0.7 (0.2) b 4.3 (0.8) ab 34.3 (7.2) a
UAN-148 V3 NH 10.9 (1.3) b 1.4 (0.9) a 0.0 (0.0) b 0.3 (0.1) b 10.9 (3.0) cd 47.1 (2.3) b
UAN-148 V6 NE 5.2 (1.0) ab 0.0 (0.0) a 0.5 (0.1) c 12.1 (1.3) a 1.2 (1.1) ab 15.3 (3.2) a
UAN-148 V6 NH 10.6 (1.1) ab 1.0 (0.7) a 0.9 (0.2) b 3.2 (0.9) b 1.3 (0.4) bc 35.3 (2.6) a
Both-158 V3 NE 12.3 (2.0) ab 0.8 (0.5) a 0.4 (0.0) b 1.5 (0.2) b 13.6 (4.3) a 34.2 (3.0) a
Both-158 V3 NH 12.4 (1.8) b 1.5 (1.0) a 0.3 (0.0) b 1.0 (0.2) b 25.2 (2.9) ab 36.7 (11.3) b
Both-158 V6 NE 7.3 (2.5) ab 0.0 (0.0) a 0.7 (0.1) bc 12.8 (1.6) a 1.9 (0.5) ab 16.0 (4.7) a
Both-158 V6 NH 10.3 (1.0) ab 0.4 (0.2) a 1.2 (0.1) b 6.4 (0.9) b 5.1 (0.5) b 28.0 (1.6) a

N derived from fertilizer in crop biomass graph

model_v3_neb_shoot <- lm(FertN_shoot_kg_ha  ~ trt + row, data = dat_Neb_V3)
model_v6_neb_shoot <- lm(FertN_shoot_kg_ha ~ trt + row, data = dat_Neb_V6)
model_v3_nh_shoot  <- lm(FertN_shoot_kg_ha  ~ trt + row, data = dat_NH_V3)
model_v6_nh_shoot  <- lm(FertN_shoot_kg_ha  ~ trt + row, data = dat_NH_V6)

emm_v3_neb_shoot <- emmeans(model_v3_neb_shoot, ~ trt)
emm_v6_neb_shoot <- emmeans(model_v6_neb_shoot, ~ trt)
emm_v3_nh_shoot  <- emmeans(model_v3_nh_shoot,  ~ trt)
emm_v6_nh_shoot  <- emmeans(model_v6_nh_shoot,  ~ trt)

cld_v3_neb_shoot <- cld(emm_v3_neb_shoot, Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)
cld_v6_neb_shoot <- cld(emm_v6_neb_shoot, Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)
cld_v3_nh_shoot  <- cld(emm_v3_nh_shoot,  Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)
cld_v6_nh_shoot  <- cld(emm_v6_nh_shoot,  Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)

shoot_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_shoot) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_shoot) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_shoot)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_shoot)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr::rename(shoot_cld = .group) %>%
  dplyr::mutate(shoot_cld = gsub(" ", "", shoot_cld)) %>%
  dplyr::select(trt, location, stage, shoot_cld)

#-----------------------------
# ROOT models
#-----------------------------
model_v3_neb_root <- lm(FertN_root_kg_ha ~ trt + row, data = dat_Neb_V3_Inf)
model_v6_neb_root <- lm(FertN_root_kg_ha~ trt + row, data = dat_Neb_V6_Inf)
model_v3_nh_root  <- lm(FertN_root_kg_ha ~ trt + row, data = dat_NH_V3_Inf)
model_v6_nh_root  <- lm(FertN_root_kg_ha ~ trt + row, data = dat_NH_V6_Inf)

emm_v3_neb_root <- emmeans(model_v3_neb_root, ~ trt)
emm_v6_neb_root <- emmeans(model_v6_neb_root, ~ trt)
emm_v3_nh_root  <- emmeans(model_v3_nh_root,  ~ trt)
emm_v6_nh_root  <- emmeans(model_v6_nh_root,  ~ trt)

cld_v3_neb_root <- cld(emm_v3_neb_root, Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)
cld_v6_neb_root <- cld(emm_v6_neb_root, Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)
cld_v3_nh_root  <- cld(emm_v3_nh_root,  Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)
cld_v6_nh_root  <- cld(emm_v6_nh_root,  Letters = letters, alpha = 0.05,sort= TRUE, reversed= TRUE)

root_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_root) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_root) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_root)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_root)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr:: rename(root_cld = .group) %>%
  dplyr:: mutate(root_cld = gsub(" ", "", root_cld)) %>%
  dplyr:: select(trt, location, stage, root_cld)

plot_summary <- InF %>%
  dplyr::select(trt, location, stage, row, FertN_shoot_kg_ha, FertN_root_kg_ha) %>%
  dplyr::group_by(trt, location, stage) %>%
  dplyr:: summarise(
    mean_root  = mean(FertN_root_kg_ha, na.rm = TRUE),
    se_root    = sd(FertN_root_kg_ha, na.rm = TRUE) / sqrt(sum(!is.na(FertN_root_kg_ha))),
    mean_shoot = mean(FertN_shoot_kg_ha, na.rm = TRUE),
    se_shoot   = sd(FertN_shoot_kg_ha, na.rm = TRUE) / sqrt(sum(!is.na(FertN_shoot_kg_ha))),
    .groups = "drop"
  ) %>%
  left_join(shoot_cld_df, by = c("trt", "location", "stage")) %>%
  left_join(root_cld_df,  by = c("trt", "location", "stage"))

plotdata <- plot_summary %>%
  dplyr:: select(trt, location, stage, mean_root, mean_shoot) %>%
  pivot_longer(
    cols = c(mean_root, mean_shoot),
    names_to = "pool",
    values_to = "amount"
  ) %>%
  dplyr::  mutate(
    pool = factor(pool,
                  levels = c("mean_root", "mean_shoot"),
                  labels = c("Root", "Shoot"))
  )

# shoot error bars: centered on top of shoot segment
shoot_err <- plot_summary %>%
  dplyr::mutate(
    ymin = mean_shoot - se_shoot,
    ymax = mean_shoot + se_shoot
  )

# root error bars: root segment sits above shoot
root_err <- plot_summary %>%
  dplyr::mutate(
    root_top = mean_shoot + mean_root,
    ymin = root_top - se_root,
    ymax = root_top + se_root
  )

label_df <- plot_summary %>%
  dplyr::group_by(location, stage) %>%
  dplyr::mutate(
    panel_max = max(mean_shoot + mean_root + se_root, na.rm = TRUE),
    
    shoot_lab_y = mean_shoot + se_shoot + 0.06 * panel_max,
    root_lab_y  = mean_shoot + mean_root + se_root + 0.06 * panel_max
  ) %>%
  ungroup()
p1 <- ggplot(plotdata, aes(x = factor(trt), y = amount, fill = pool)) +
  geom_col(width = 0.60) +
  
  geom_errorbar(
    data = shoot_err,
    aes(
      x = as.numeric(factor(trt)) - 1.3*dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    inherit.aes = FALSE
  ) +
  
  geom_errorbar(
    data = root_err,
    aes(
      x = as.numeric(factor(trt)) + 1.3*dodge_amt,
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    color= "grey40",
    inherit.aes = FALSE
  ) +
  
  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)) -1.3* dodge_amt,
      y = shoot_lab_y,
      label = shoot_cld
    ),
    inherit.aes = FALSE,
    size = 5
  ) +
  
  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)) + 1.3*dodge_amt,
      y = root_lab_y,
      label = toupper(root_cld)
    ),
    inherit.aes = FALSE,
    size = 3.8,
    color= "grey40"
  ) +
  
  facet_grid(vars(stage), vars(location), scales = "free_y") +
  labs(
    x = "Fertilizer-N treatment",
    y = expression("N derived from fertilizer in crop biomass (kg ha"^{-1}*")"),
    fill = "Component"
  ) +
  scale_fill_manual(
    values = c(
      "Root" = "#D8A24A",
      "Shoot" = "#4A9B83"
    )
  )+
  theme_Manjot() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

p1

ggsave("Ndffbiomass3.png", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)

15N recovery % in all pools (except whole soil) graph

plotdata <- InF %>%
  dplyr::select(
    trt,
    location,
    stage,
    row,
    per_Recov_MAOM_tot,
    per_Recov_TDN_tot,
    per_Recov_MBN_tot,
    perRecov_shoot,
    perRecov_root
  ) %>%
  
  dplyr::group_by(trt, location, stage) %>%
  
  dplyr::summarise(
    mean_arootrec  = mean(perRecov_root, na.rm = TRUE),
    mean_bshootrec = mean(perRecov_shoot, na.rm = TRUE),
    mean_maomrec   = mean(per_Recov_MAOM_tot, na.rm = TRUE),
    mean_mbnrec    = mean(
      per_Recov_MBN_tot,
      na.rm = TRUE
    ),
    mean_tdnrec    = mean(per_Recov_TDN_tot, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  
  tidyr::pivot_longer(
    cols = c(
      mean_arootrec,
      mean_bshootrec,
      mean_maomrec,
      mean_mbnrec,
      mean_tdnrec
    ),
    names_to = "pool",
    values_to = "amount"
  ) %>%
  
  dplyr::mutate(
    pool = factor(
      pool,
      levels = c(
        "mean_arootrec",
        "mean_bshootrec",
        "mean_maomrec",
        "mean_mbnrec",
        "mean_tdnrec"
      )
    )
  )


# Invisible values used to set separate y-axis ranges for V3 and V6
axis_caps <- plotdata %>%
  dplyr::distinct(stage, location) %>%
  dplyr::mutate(
    trt = dplyr::first(plotdata$trt),
    amount = dplyr::if_else(stage == "V3", 110, 60)
  )


p1 <- ggplot2::ggplot(
  plotdata,
  ggplot2::aes(
    x = factor(trt),
    y = amount,
    fill = pool
  )
) +
  
  ggplot2::geom_col(
    position = "stack",
    width = 0.60
  ) +
  
  # Invisible points force V3 to 110 and V6 to 60
  ggplot2::geom_blank(
    data = axis_caps,
    ggplot2::aes(
      x = factor(trt),
      y = amount
    ),
    inherit.aes = FALSE
  ) +
  
  ggplot2::facet_grid(
    ggplot2::vars(stage),
    ggplot2::vars(location),
    scales = "free_y"
  ) +
  
  ggplot2::scale_fill_manual(
    values = c(
      "mean_arootrec"  = "#D8A24A",  # Root: muted gold
      "mean_bshootrec" = "#4A9B83",  # Shoot: muted green
      "mean_maomrec"   = "#8E5A8A",  # MAOM: warm purple
      "mean_mbnrec"    = "#C48FB3",  # MBN: light warm purple
      "mean_tdnrec"    = "#6678B8"   # TDN: cool blue-purple
    ),
    breaks = c(
      "mean_arootrec",
      "mean_bshootrec",
      "mean_maomrec",
      "mean_mbnrec",
      "mean_tdnrec"
    ),
    labels = c(
      "Root",
      "Shoot",
      "MAOM",
      "MBN",
      "TDN"
    )
  ) +
  
  ggplot2::labs(
    x = "Fertilizer treatment",
    y = expression({}^{15}*"N recovery (%)"),
    fill = "Pools"
  ) +
  
  theme_Manjot() +
  
  ggplot2::theme(
    axis.text = ggplot2::element_text(size = 15),
    
    axis.text.x = ggplot2::element_text(
      angle = 45,
      hjust = 1
    ),
    
    axis.title = ggplot2::element_text(size = 16),
    
    plot.title = ggplot2::element_text(
      size = 18,
      face = "bold"
    ),
    
    plot.subtitle = ggplot2::element_text(size = 14),
    
    legend.title = ggplot2::element_text(size = 15),
    legend.text = ggplot2::element_text(size = 14)
  )

p1

ggsave("15Nrecoveryall.png", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)

Band root biomass graph

model_v6_neb_root <- lm(root_wt ~ trt + row, data = dat_Neb_V6_Band)

model_v6_nh_root  <- lm(root_wt  ~ trt + row, data = dat_NH_V6_Band)

emm_v6_neb_root <- emmeans(model_v6_neb_root, ~ trt)

emm_v6_nh_root  <- emmeans(model_v6_nh_root,  ~ trt)


cld_v6_neb_root <- cld(emm_v6_neb_root, Letters = letters, alpha = 0.05, reversed= TRUE)

cld_v6_nh_root  <- cld(emm_v6_nh_root,  Letters = letters, alpha = 0.05, reversed= TRUE)

root_cld_df <- bind_rows(
  as.data.frame(cld_v6_neb_root) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v6_nh_root)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr:: rename(root_cld = .group) %>%
  dplyr:: mutate(root_cld = gsub(" ", "", root_cld)) %>%
  dplyr:: select(trt, location, root_cld)

plot_summary <- Band_V6 %>%
  dplyr::select(trt, location, row, root_wt ) %>%
  dplyr::group_by(trt, location) %>%
  dplyr:: summarise(
    mean_root  = mean(root_wt, na.rm = TRUE),
    se_root    = sd(root_wt, na.rm = TRUE) / sqrt(sum(!is.na(root_wt ))),
    .groups = "drop"
  ) %>%
  left_join(root_cld_df,  by = c("trt", "location"))

plotdata <- plot_summary %>%
  dplyr:: select(trt, location, mean_root) %>%
  pivot_longer(
    cols = c(mean_root),
    names_to = "pool",
    values_to = "amount"
  ) %>%
  dplyr::  mutate(
    pool = factor(pool,
                  levels = c("mean_root"),
                  labels = c("Root"))
  )

# root error bars: centered on top of shoot segment
root_err <- plot_summary %>%
  dplyr::mutate(
    ymin = mean_root - se_root,
    ymax = mean_root + se_root
  )


label_df <- plot_summary %>%
  dplyr::group_by(location) %>%
  dplyr::mutate(
    panel_max = max(mean_root + se_root, na.rm = TRUE),
    root_lab_y  = mean_root + se_root + 0.06 * panel_max
  ) %>%
  ungroup()

dodge_amt <- 0.09

p1 <- ggplot(plotdata, aes(x = factor(trt), y = amount, fill = pool)) +
  geom_col(width = 0.60) +
  
  geom_errorbar(
    data = root_err,
    aes(
      x = as.numeric(factor(trt)),
      ymin = ymin,
      ymax = ymax
    ),
    width = 0.12,
    linewidth = 0.5,
    inherit.aes = FALSE
  ) +

  geom_text(
    data = label_df,
    aes(
      x = as.numeric(factor(trt)),
      y = root_lab_y,
      label = root_cld
    ),
    inherit.aes = FALSE,
    size = 5
  ) +
  
  facet_grid(vars(location), scales = "free_y") +
  labs(
    x = "Fertilizer-N treatment",
    y = expression("Band root biomass (kg ha"^{-1}*")"),
    fill = "Component"
  ) +
  #scale_fill_brewer(palette = "Pastel2", labels = c("Root")) +
  scale_fill_manual(
    values = c(
      "Root" = "#D8A24A"
    )
  )+
  theme_Manjot() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

p1

Ndff in TDN graph

#TDN band models
model_v3_neb_shoot <- lm(kgN_dff_TDN_ha_band ~ trt + row, data = dat_Neb_V3)
model_v6_neb_shoot <- lm(kgN_dff_TDN_ha_band~ trt + row, data = dat_Neb_V6)
model_v3_nh_shoot  <- lm(kgN_dff_TDN_ha_band~ trt + row, data = dat_NH_V3)
model_v6_nh_shoot  <- lm(kgN_dff_TDN_ha_band~ trt + row, data = dat_NH_V6)

emm_v3_neb_shoot <- emmeans(model_v3_neb_shoot, ~ trt)
emm_v6_neb_shoot <- emmeans(model_v6_neb_shoot, ~ trt)
emm_v3_nh_shoot  <- emmeans(model_v3_nh_shoot,  ~ trt)
emm_v6_nh_shoot  <- emmeans(model_v6_nh_shoot,  ~ trt)

cld_v3_neb_shoot <- cld(emm_v3_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_shoot <- cld(emm_v6_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_shoot  <- cld(emm_v3_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_shoot  <- cld(emm_v6_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

shoot_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_shoot) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_shoot) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_shoot)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_shoot)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr::rename(shoot_cld = .group) %>%
  dplyr::mutate(shoot_cld = gsub(" ", "", shoot_cld)) %>%
  dplyr::select(trt, location, stage, shoot_cld)

#-----------------------------
# TDN furrow models
#-----------------------------
model_v3_neb_root <- lm(kgN_dff_TDN_ha ~ trt + row, data = dat_Neb_V3_Inf)
model_v6_neb_root <- lm(kgN_dff_TDN_ha~ trt + row, data = dat_Neb_V6_Inf)
model_v3_nh_root  <- lm(kgN_dff_TDN_ha ~ trt + row, data = dat_NH_V3_Inf)
model_v6_nh_root  <- lm(kgN_dff_TDN_ha ~ trt + row, data = dat_NH_V6_Inf)

emm_v3_neb_root <- emmeans(model_v3_neb_root, ~ trt)
emm_v6_neb_root <- emmeans(model_v6_neb_root, ~ trt)
emm_v3_nh_root  <- emmeans(model_v3_nh_root,  ~ trt)
emm_v6_nh_root  <- emmeans(model_v6_nh_root,  ~ trt)

cld_v3_neb_root <- cld(emm_v3_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_root <- cld(emm_v6_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_root  <- cld(emm_v3_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_root  <- cld(emm_v6_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

root_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_root) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_root) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_root)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_root)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr:: rename(root_cld = .group) %>%
  dplyr:: mutate(root_cld = gsub(" ", "", root_cld)) %>%
  dplyr:: select(trt, location, stage, root_cld)

plot_summary <- InF %>%
  dplyr::select(trt, location, stage, row, kgN_dff_TDN_ha_band, kgN_dff_TDN_ha) %>%
  dplyr::group_by(trt, location, stage) %>%
  dplyr:: summarise(
    mean_root  = mean(kgN_dff_TDN_ha, na.rm = TRUE),
    se_root    = sd(kgN_dff_TDN_ha, na.rm = TRUE) / sqrt(sum(!is.na(kgN_dff_TDN_ha))),
    mean_shoot = mean(kgN_dff_TDN_ha_band, na.rm = TRUE),
    se_shoot   = sd(kgN_dff_TDN_ha_band, na.rm = TRUE) / sqrt(sum(!is.na(kgN_dff_TDN_ha_band))),
    .groups = "drop"
  ) %>%
  left_join(shoot_cld_df, by = c("trt", "location", "stage")) %>%
  left_join(root_cld_df,  by = c("trt", "location", "stage"))

plotdata <- plot_summary %>%
  dplyr:: select(trt, location, stage, mean_root, mean_shoot) %>%
  pivot_longer(
    cols = c(mean_root, mean_shoot),
    names_to = "pool",
    values_to = "amount"
  ) %>%
  dplyr::  mutate(
    pool = factor(pool,
                  levels = c("mean_root", "mean_shoot"),
                  labels = c("Furrow", "Band"))
  )

#=========================================================
# Prepare raw TDN data in long format
#=========================================================
trt_levels <- c(
  "InF-5",
  "InF-10",
  "UAN-74",
  "Both-79",
  "UAN-148",
  "Both-158"
)


tdn_plot_data <- InF %>%
  dplyr::select(
    trt,
    location,
    stage,
    row,
    kgN_dff_TDN_ha_band,
    kgN_dff_TDN_ha
  ) %>%
  tidyr::pivot_longer(
    cols = c(
      kgN_dff_TDN_ha_band,
      kgN_dff_TDN_ha
    ),
    names_to = "position_plot",
    values_to = "amount"
  ) %>%
  dplyr::mutate(
    position_plot = dplyr::recode(
      position_plot,
      "kgN_dff_TDN_ha_band" = "Band",
      "kgN_dff_TDN_ha" = "Furrow"
    ),
    
    trt = factor(
      as.character(trt),
      levels = trt_levels
    ),
    
    stage = factor(
      as.character(stage),
      levels = c("V3", "V6")
    ),
    
    location = factor(
      as.character(location),
      levels = c("NE", "NH")
    ),
    
    position_plot = factor(
      position_plot,
      levels = c("Band", "Furrow")
    )
  ) %>%
  dplyr::filter(
    stage %in% c("V3", "V6"),
    location %in% c("NE", "NH"),
    !is.na(amount)
  )


#=========================================================
# Combine CLD letters for Band and Furrow
#=========================================================

position_cld_df <- dplyr::bind_rows(
  
  shoot_cld_df %>%
    dplyr::transmute(
      trt = as.character(trt),
      location = as.character(location),
      stage = as.character(stage),
      position_plot = "Band",
      cld = shoot_cld
    ),
  
  root_cld_df %>%
    dplyr::transmute(
      trt = as.character(trt),
      location = as.character(location),
      stage = as.character(stage),
      position_plot = "Furrow",
      cld = root_cld
    )
) %>%
  dplyr::mutate(
    trt = factor(trt, levels = trt_levels),
    
    location = factor(
      location,
      levels = c("NE", "NH")
    ),
    
    stage = factor(
      stage,
      levels = c("V3", "V6")
    ),
    
    position_plot = factor(
      position_plot,
      levels = c("Band", "Furrow")
    )
  )


#=========================================================
# Calculate boxplot upper whiskers for CLD positions
#=========================================================

label_df <- tdn_plot_data %>%
  dplyr::group_by(
    location,
    position_plot,
    stage,
    trt
  ) %>%
  dplyr::summarise(
    y_pos = boxplot.stats(amount)$stats[5],
    .groups = "drop"
  ) %>%
  dplyr::left_join(
    position_cld_df,
    by = c(
      "trt",
      "location",
      "stage",
      "position_plot"
    )
  ) %>%
  dplyr::group_by(
    location,
    position_plot
  ) %>%
  dplyr::mutate(
    panel_min = min(y_pos, na.rm = TRUE),
    panel_max = max(y_pos, na.rm = TRUE),
    panel_range = panel_max - panel_min,
    
    label_offset = dplyr::if_else(
      panel_range > 0,
      0.04 * panel_range,
      0.04 * abs(panel_max)
    ),
    
    y_pos = y_pos + label_offset
  ) %>%
  dplyr::ungroup()


#=========================================================
# Create dodged boxplot
#=========================================================

dodge_width <- 0.75

tdn_plot_data_plot <- tdn_plot_data %>%
  dplyr::group_by(
    location,
    position_plot,
    stage,
    trt
  ) %>%
  dplyr::ungroup()

label_df <- tdn_plot_data_plot %>%
  dplyr::group_by(
    location,
    position_plot,
    stage,
    trt
  ) %>%
  dplyr::summarise(
    y_pos = boxplot.stats(amount)$stats[5],
    .groups = "drop"
  ) %>%
  dplyr::left_join(
    position_cld_df,
    by = c(
      "trt",
      "location",
      "stage",
      "position_plot"
    )
  ) %>%
  dplyr::group_by(location, position_plot) %>%
  dplyr::mutate(
    panel_max = max(y_pos, na.rm = TRUE),
    label_offset = 0.05 * pmax(panel_max, 0.1),
    y_pos = y_pos + label_offset
  ) %>%
  dplyr::ungroup()

p1 <- ggplot2::ggplot(
  tdn_plot_data_plot,
  ggplot2::aes(
    x = trt,
    y = amount,
    fill = stage,
    group = interaction(trt, stage)
  )
) +
  
  ggplot2::geom_boxplot(
    position = ggplot2::position_dodge(
      width = dodge_width
    ),
    width = 0.60,
    linewidth = 0.5
  ) +
  
  ggplot2::geom_text(
    data = label_df,
    ggplot2::aes(
      x = trt,
      y = y_pos,
      label = cld,
      group = stage
    ),
    position = ggplot2::position_dodge(
      width = dodge_width
    ),
    inherit.aes = FALSE,
    size = 5
  ) +
  
  # Band and Furrow receive separate y-axis scales
  # NE and NH remain as columns
  ggplot2::facet_grid(
    rows = ggplot2::vars(position_plot),
    cols = ggplot2::vars(location),
    scales = "free_y"
  ) +
  
  # Blue palette consistent with TDN
  ggplot2::scale_fill_manual(
    values = c(
      "V3" = "#4F66A8",
      "V6" = "#8DBCE6"
    ),
    breaks = c("V3", "V6")
  ) +
  
  ggplot2::scale_y_continuous(
    expand = ggplot2::expansion(
      mult = c(0.03, 0.15)
    )
  ) +
  
  ggplot2::labs(
    x = "Fertilizer-N treatment",
    y = expression(
      "Amount N dff in TDN (kg N ha"^{-1} * ")"
    ),
    fill = "Growth stage"
  ) +
  
  theme_Manjot() +
  
  ggplot2::theme(
    axis.text = ggplot2::element_text(size = 13),
    
    axis.text.x = ggplot2::element_text(
      angle = 45,
      hjust = 1
    ),
    
    axis.title = ggplot2::element_text(size = 16),
    
    plot.title = ggplot2::element_text(
      size = 18,
      face = "bold"
    ),
    
    legend.title = ggplot2::element_text(size = 14),
    legend.text = ggplot2::element_text(size = 13),
    
    strip.text = ggplot2::element_text(
      size = 14,
      face = "bold"
    )
  )

p1

ggsave("TDNexp2dffbox.jpg", p1, device = ragg::agg_png, width = 12, height = 8, units = "in", dpi = 300)

DIN graph

#-------------
# DIN band models
#--------------
model_v3_neb_shoot <- lm(ug_DIN_g~ trt + row, data = dat_Neb_V3_Band)
model_v6_neb_shoot <- lm(ug_DIN_g~ trt + row, data = dat_Neb_V6_Band)
model_v3_nh_shoot  <- lm(ug_DIN_g~ trt + row, data = dat_NH_V3_Band)
model_v6_nh_shoot  <- lm(ug_DIN_g~ trt + row, data = dat_NH_V6_Band)

emm_v3_neb_shoot <- emmeans(model_v3_neb_shoot, ~ trt)
emm_v6_neb_shoot <- emmeans(model_v6_neb_shoot, ~ trt)
emm_v3_nh_shoot  <- emmeans(model_v3_nh_shoot,  ~ trt)
emm_v6_nh_shoot  <- emmeans(model_v6_nh_shoot,  ~ trt)

cld_v3_neb_shoot <- cld(emm_v3_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_shoot <- cld(emm_v6_neb_shoot, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_shoot  <- cld(emm_v3_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_shoot  <- cld(emm_v6_nh_shoot,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

shoot_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_shoot) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_shoot) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_shoot)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_shoot)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr::rename(shoot_cld = .group) %>%
  dplyr::mutate(shoot_cld = gsub(" ", "", shoot_cld)) %>%
  dplyr::select(trt, location, stage, shoot_cld)

#-----------------------------
# DIN Furrow models
#-----------------------------
model_v3_neb_root <- lm(ug_DIN_g ~ trt + row, data = dat_Neb_V3_Inf)
model_v6_neb_root <- lm(ug_DIN_g~ trt + row, data = dat_Neb_V6_Inf)
model_v3_nh_root  <- lm(ug_DIN_g ~ trt + row, data = dat_NH_V3_Inf)
model_v6_nh_root  <- lm(ug_DIN_g ~ trt + row, data = dat_NH_V6_Inf)

emm_v3_neb_root <- emmeans(model_v3_neb_root, ~ trt)
emm_v6_neb_root <- emmeans(model_v6_neb_root, ~ trt)
emm_v3_nh_root  <- emmeans(model_v3_nh_root,  ~ trt)
emm_v6_nh_root  <- emmeans(model_v6_nh_root,  ~ trt)

cld_v3_neb_root <- cld(emm_v3_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_neb_root <- cld(emm_v6_neb_root, Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v3_nh_root  <- cld(emm_v3_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)
cld_v6_nh_root  <- cld(emm_v6_nh_root,  Letters = letters, alpha = 0.05, sort= TRUE, reversed= TRUE)

root_cld_df <- bind_rows(
  as.data.frame(cld_v3_neb_root) %>% mutate(stage = "V3", location = "NE"),
  as.data.frame(cld_v6_neb_root) %>% mutate(stage = "V6", location = "NE"),
  as.data.frame(cld_v3_nh_root)  %>% mutate(stage = "V3", location = "NH"),
  as.data.frame(cld_v6_nh_root)  %>% mutate(stage = "V6", location = "NH")
) %>%
  dplyr:: rename(root_cld = .group) %>%
  dplyr:: mutate(root_cld = gsub(" ", "", root_cld)) %>%
  dplyr:: select(trt, location, stage, root_cld)


position_cld_df <- dplyr::bind_rows(
  shoot_cld_df %>%
    dplyr::transmute(
      trt,
      location,
      stage,
      position = "Band",
      cld = shoot_cld
    ),
  
  root_cld_df %>%
    dplyr::transmute(
      trt,
      location,
      stage,
      position = "In-row",
      cld = root_cld
    )
)

din_plot_data <- data_new %>%
  dplyr::filter(stage %in% c("V3", "V6")) %>%
  dplyr::mutate(
    position_plot = dplyr::case_when(
      position == "Band" ~ "Band",
      position %in% c("Inf", "InF", "Furrow", "In-row") ~ "Furrow",
      TRUE ~ NA_character_
    )
  ) %>%
  dplyr::filter(
    !is.na(position_plot),
    !is.na(ug_DIN_g)
  ) %>%
  dplyr::mutate(
    position_plot = factor(
      position_plot,
      levels = c("Band", "Furrow")
    )
  )


#---------------------------------------------------------
# Combine CLD letters for the two positions
#---------------------------------------------------------

position_cld_df <- dplyr::bind_rows(
  
  shoot_cld_df %>%
    dplyr::transmute(
      trt,
      location,
      stage,
      position_plot = "Band",
      cld = shoot_cld
    ),
  
  root_cld_df %>%
    dplyr::transmute(
      trt,
      location,
      stage,
      position_plot = "Furrow",
      cld = root_cld
    )
) %>%
  dplyr::mutate(
    position_plot = factor(
      position_plot,
      levels = c("Band", "Furrow")
    )
  )


#---------------------------------------------------------
# Calculate upper-whisker positions for CLD letters
#---------------------------------------------------------

label_df <- din_plot_data %>%
  dplyr::group_by(
    location,
    position_plot,
    stage,
    trt
  ) %>%
  dplyr::summarise(
    y_pos = boxplot.stats(ug_DIN_g)$stats[5],
    .groups = "drop"
  ) %>%
  dplyr::left_join(
    position_cld_df,
    by = c(
      "trt",
      "location",
      "stage",
      "position_plot"
    )
  ) %>%
  dplyr::group_by(location, position_plot, stage) %>%
  dplyr::mutate(
    stage_min = min(y_pos, na.rm = TRUE),
    stage_max = max(y_pos, na.rm = TRUE),
    stage_range = stage_max - stage_min,
    label_offset = 0.08 * pmax(stage_range, stage_max, 1),
    y_pos = y_pos + label_offset
  ) %>%
  dplyr::ungroup()

#---------------------------------------------------------
# Dodged DIN boxplot
#---------------------------------------------------------

dodge_width <- 0.75

p1 <- ggplot2::ggplot(
  din_plot_data,
  ggplot2::aes(
    x = factor(trt),
    y = ug_DIN_g,
    fill = stage,
    group = interaction(trt, stage)
  )
) +
  
  ggplot2::geom_boxplot(
    position = ggplot2::position_dodge(width = dodge_width),
    width = 0.60,
    linewidth = 0.5
  ) +
  
  ggplot2::geom_text(
    data = label_df,
    ggplot2::aes(
      x = factor(trt),
      y = y_pos,
      label = cld,
      group = stage
    ),
    position = ggplot2::position_dodge(width = dodge_width),
    inherit.aes = FALSE,
    size = 5
  ) +
  
  # Band and Furrow are rows; NE and NH are columns
  ggplot2::facet_grid(
    rows = ggplot2::vars(position_plot),
    cols = ggplot2::vars(location),
    scales = "free_y",
    labeller = ggplot2::labeller(
      position_plot = c(
        Band = "Band",
        Furrow = "Furrow"
      )
    )
  ) +
  
  ggplot2::scale_fill_manual(
    values = c(
      "V3" = "#4F66A8",
      "V6" = "#8DBCE6"
    )
  ) +
  
  ggplot2::scale_y_continuous(
    expand = ggplot2::expansion(mult = c(0.03, 0.15))
  ) +
  
  ggplot2::labs(
    x = "Fertilizer-N treatment",
    y = expression(
      "DIN (" * mu * "g N g"^{-1} * " soil)"
    ),
    fill = "Growth stage",
  ) +
  
  theme_Manjot() +
  
  ggplot2::theme(
    axis.text = ggplot2::element_text(size = 13),
    axis.text.x = ggplot2::element_text(
      angle = 45,
      hjust = 1
    ),
    axis.title = ggplot2::element_text(size = 16),
    legend.title = ggplot2::element_text(size = 14),
    legend.text = ggplot2::element_text(size = 13),
    strip.text = ggplot2::element_text(
      size = 14,
      face = "bold"
    )
  )

p1