The purpose of this page is to document the analyses of the redcedar adaptation network data.

Merged data set was downloaded from adaptation-data-merged.csv. Analyses were completed to explore the relationship between origin seed zone and two continuous and one binary variable representing tree health.

Two identical analyses were completed to determine whether wildlife tree browsing activity posed as a confounded variable in our experimental design as levels of browsing varied from none to heavily browsed across each planting site. The first set of analyses completely excluded browsed trees from the data set if the trees were ever browsed across all measurement years. The second set of analyses included every tree regardless of browsing level.

Load packages

library(tidyverse)
library(kableExtra)
library(patchwork)
library(zoo)
library(readxl)
library(knitr)

Import data

trees <- read.csv("https://raw.githubusercontent.com/zarigal/adaptation/refs/heads/main/data/adaptation-data-merged.csv")
#if offline - data <-read.csv("data/adaptation-data-merged.csv")

Data not including browsed

The following plots, tables, and analysis completely excludes all years’ measurements from trees that had any instance of wildlife browsing observed during re-measurements.

trees.no.browse <- trees %>%
  group_by(Tree.Number, Site, Seed.Zone) %>%
  filter(Elk.Browse !="Y") %>% ungroup()

treesno.wide <- trees.no.browse %>% pivot_wider(
    id_cols = c(Tree.Number, Site, Seed.Zone, New.Tree.Number),
    names_from = Measurement.Year,
    values_from = c(Tree.Height..cm., Tree.Diameter..mm.),
    names_glue = "{.value}_{Measurement.Year}")

treesno.wide.growth <- treesno.wide %>% mutate(y1.height.growth = Tree.Height..cm._2023-Tree.Height..cm._2022, y2.height.growth = Tree.Height..cm._2024-Tree.Height..cm._2023, y3.height.growth = Tree.Height..cm._2025-Tree.Height..cm._2024, y1.diameter.growth = Tree.Diameter..mm._2023-Tree.Diameter..mm._2022, y2.diameter.growth = Tree.Diameter..mm._2024-Tree.Diameter..mm._2023, y3.diameter.growth = Tree.Diameter..mm._2025 - Tree.Diameter..mm._2024, total.height.growth = Tree.Height..cm._2025-Tree.Height..cm._2022, total.diameter.growth = Tree.Diameter..mm._2025-Tree.Diameter..mm._2022)

treesno.wide.pos.total <- treesno.wide.growth %>% filter(total.height.growth>0 & total.diameter.growth>0)
treesno.wide.pos.y1 <- treesno.wide.growth %>% filter(y1.height.growth>0 & y1.diameter.growth>0)
treesno.wide.pos.y2 <- treesno.wide.growth %>% filter(y2.height.growth>0 & y2.diameter.growth>0)
treesno.wide.pos.y3 <- treesno.wide.growth %>% filter(y3.height.growth>0 & y3.diameter.growth>0)
treesno.wide.pos.all <- treesno.wide.growth %>% filter(y1.height.growth>0 & y1.diameter.growth>0 &
  y2.height.growth>0 & y2.diameter.growth>0 & y3.height.growth>0 & y3.diameter.growth>0)

Number of Trees

The below table lists the number of trees that were remeasured in 2025 at each site, excluding outliers.

  • Note, this table only includes trees that had positive height and diameter growth. For example, some trees were heavily browsed in 2024 and therefore may be shorter than trees in 2023.
Site.Summary <- treesno.wide.pos.all %>% group_by(Site,Seed.Zone) %>% summarize(n=n())
kable(Site.Summary[c(1,2,3)], col.names = c("Site", "Seed Zone", "Number of Trees")) %>% kable_material(c("striped", "hover","condensed"))
Site Seed Zone Number of Trees
Renton OR 14
Renton WA 31
Seattle OR 27
Seattle WA 33
Swan Creek OR 26
Swan Creek WA 19
Tomanamus OR 7
Tomanamus WA 3

Mean Height and Diameter Increase

The below table lists mean height and diameter increases between seed zones.

treesno.summary <- treesno.wide.pos.all %>% group_by(Seed.Zone)  %>% summarize(n=n(),
meanno.height.2025=mean(Tree.Height..cm._2025),
meanno.diameter.2025=mean(Tree.Diameter..mm._2025),
meanno.y1.height.growth=mean(y1.height.growth,na.rm=TRUE),
meanno.y1.diameter.growth=mean(y1.diameter.growth,na.rm=TRUE),
meanno.y2.height.growth=mean(y2.height.growth,na.rm=TRUE),
meanno.y2.diameter.growth=mean(y2.diameter.growth,na.rm=TRUE),
meanno.y3.diameter.growth=mean(y3.diameter.growth,na.rm=TRUE),
meanno.y3.height.growth=mean(y3.height.growth,na.rm=TRUE),
meanno.total.height.growth=mean(total.height.growth,na.rm=TRUE),
meanno.total.diameter.growth=mean(total.diameter.growth,na.rm=TRUE))

kable(treesno.summary,col.names = c("Seed Zone", "Number of Trees", "2025 Mean Height (cm)", "2025 Mean Diameter (mm)", "Mean Year 1 Height Growth (cm)", "Mean Year 1 Diameter Growth (mm)", "Mean Year 2 Height Growth (cm)","Mean Year 2 Diameter Growth (mm)", "Mean Year 3 Height Growth (cm)","Mean Year 3 Diameter Growth (mm)", "Total Mean Height Growth (cm)","Total Mean Diameter Growth (mm)"), digits = 2,format = "html",table.attr='class="scrollable-table"') %>% kable_material(c("striped", "hover","condensed")) %>% kable_styling(full_width = F) %>% scroll_box(height = "200px")
Seed Zone Number of Trees 2025 Mean Height (cm) 2025 Mean Diameter (mm) Mean Year 1 Height Growth (cm) Mean Year 1 Diameter Growth (mm) Mean Year 2 Height Growth (cm) Mean Year 2 Diameter Growth (mm) Mean Year 3 Height Growth (cm) Mean Year 3 Diameter Growth (mm) Total Mean Height Growth (cm) Total Mean Diameter Growth (mm)
OR 74 158.84 34.39 8.36 3.85 32.46 11.04 10.50 34.36 75.19 25.39
WA 86 171.20 35.49 7.38 3.79 33.39 10.05 11.39 37.80 78.57 25.23

Trees from Oregon had a mean total height increase of 75.19cm and trees from Washington had a mean total height increase of 78.57cm.


Mean Increase by Site

The table below provides the same data, expect the means were calculated across seed zones and sites.

treesno.summary.sites <- treesno.wide.pos.all %>% group_by(Site,Seed.Zone)  %>% summarize(
n=n(),
meanno.height.2025=mean(Tree.Height..cm._2025),
meanno.diameter.2025=mean(Tree.Diameter..mm._2025),
meanno.y1.height.growth=mean(y1.height.growth,na.rm=TRUE),
meanno.y1.diameter.growth=mean(y1.diameter.growth,na.rm=TRUE),
meanno.y2.height.growth=mean(y2.height.growth,na.rm=TRUE),
meanno.y2.diameter.growth=mean(y2.diameter.growth,na.rm=TRUE),
meanno.y3.diameter.growth=mean(y3.diameter.growth,na.rm=TRUE),
meanno.y3.height.growth=mean(y3.height.growth, na.rm = TRUE),
meanno.total.height.growth=mean(total.height.growth,na.rm=TRUE),
meanno.total.diameter.growth=mean(total.diameter.growth,na.rm=TRUE))

library(knitr)
kable(treesno.summary.sites, col.names = c("Site", "Seed Zone", "Number of Trees", "2025 Mean Height (cm)", "2025 Mean Diameter (mm)", "Mean Year 1 Height Growth (cm)", "Mean Year 1 Diameter Growth (mm)", "Mean Year 2 Height Growth (cm)","Mean Year 2 Diameter Growth (mm)", "Mean Year 3 Height Growth (cm)","Mean Year 3 Diameter Growth (mm)", "Total Mean Height Growth (cm)","Total Mean Diameter Growth (mm)"), digits = 2) %>% kable_material(c("striped", "hover","condensed")) %>% kable_styling(full_width = F) %>% scroll_box(height = "300px")
Site Seed Zone Number of Trees 2025 Mean Height (cm) 2025 Mean Diameter (mm) Mean Year 1 Height Growth (cm) Mean Year 1 Diameter Growth (mm) Mean Year 2 Height Growth (cm) Mean Year 2 Diameter Growth (mm) Mean Year 3 Height Growth (cm) Mean Year 3 Diameter Growth (mm) Total Mean Height Growth (cm) Total Mean Diameter Growth (mm)
Renton OR 14 146.29 20.76 7.93 2.81 26.21 3.12 4.94 26.86 61.00 10.87
Renton WA 31 169.23 24.80 7.95 2.78 31.55 4.60 6.52 33.71 73.21 13.91
Seattle OR 27 176.63 42.07 11.04 5.21 44.52 15.54 13.32 38.89 94.45 34.08
Seattle WA 33 180.18 44.90 8.76 5.26 41.58 14.56 15.88 40.82 91.15 35.71
Swan Creek OR 26 151.12 37.08 6.54 3.65 25.42 12.44 11.54 35.04 67.00 27.63
Swan Creek WA 19 161.21 39.43 4.46 3.33 23.53 12.25 12.86 40.21 68.20 28.44
Tomanamus OR 7 144.00 21.99 5.66 1.44 24.57 4.27 6.85 29.43 59.66 12.56
Tomanamus WA 3 156.00 17.55 4.70 0.90 24.83 2.77 2.91 31.67 61.20 6.58

Tree Height Increase

The below plots show the distributions in increases in tree height for each seed zone.

P1 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,y1.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)", x= "Seed Source",title="Year 1 Growth") + theme(plot.title = element_text(hjust = 0.5))
P2 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,y2.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)",x= "Seed Source",title="Year 2 Growth") + theme(plot.title = element_text(hjust = 0.5))
P3 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,y3.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)",x= "Seed Source",title="Year 3 Growth") + theme(plot.title = element_text(hjust = 0.5))
P4 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,total.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)",x= "Seed Source",title="Cumulative Growth") + theme(plot.title = element_text(hjust = 0.5))

height_plots <- P1 + P2 + P3 + P4
height_plots + plot_annotation(title = "Growth in Height (cm) by Year", theme = theme(plot.title = element_text(hjust = 0.5)))

The below plot shows the distributions in cumulative increase in tree height for each seed zone and site.

ggplot(treesno.wide.pos.all,aes(Seed.Zone,total.height.growth,fill=Site)) +geom_boxplot() +theme_bw() +scale_fill_manual(values=c("#E69F00", "#56B4E9", "#009E73","#9e0000")) + labs(y= "Total Height Growth (cm)",x= "Seed Source",title="Cumulative Height Growth by Site") + theme(plot.title = element_text(hjust = 0.5))


Tree Diameter Increase

The below plots show the distribution of growth in tree diameter for each seed zone.

P1 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,y1.diameter.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Diameter Growth (mm)", x= "Seed Source",title="Year 1 Growth") + theme(plot.title = element_text(hjust = 0.5))
P2 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,y2.diameter.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Diameter Growth (mm)",x= "Seed Source",title="Year 2 Growth") + theme(plot.title = element_text(hjust = 0.5))
P3 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,y3.diameter.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Diameter Growth (mm)",x= "Seed Source",title="Year 3 Growth") + theme(plot.title = element_text(hjust = 0.5))
P4 <- ggplot(treesno.wide.pos.all,aes(Seed.Zone,total.diameter.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Diameter Growth (mm)",x= "Seed Source",title="Cumulative Growth") + theme(plot.title = element_text(hjust = 0.5))

height_plots <- P1 + P2 + P3 + P4
height_plots + plot_annotation(title = "Growth in Diameter (mm) by Year", theme = theme(plot.title = element_text(hjust = 0.5)))

The below plots show the distributions in increases in tree diameter for each seed zone and site.

ggplot(treesno.wide.pos.all,aes(Seed.Zone,total.diameter.growth,fill=Site)) +geom_boxplot() +theme_bw() +scale_fill_manual(values=c("#E69F00", "#56B4E9", "#009E73","#9e0000")) + labs(y= "Total Diameter Growth (mm)",x= "Seed Source",title="Cumulative Diameter Growth by Site") + theme(plot.title = element_text(hjust = 0.5))


Mortality

The below plot shows the number of trees that fall under each Health condition: alive, dead, or missing.

  • Note: Missing trees are classified as trees that were not found during remeasurements any time from 2023-2025.
treesno.condition.zone <- trees.no.browse %>% group_by(Seed.Zone,Final.Health) %>% summarize(n=n_distinct(Temp.Tree.Number)) %>% filter(Final.Health!="NA")

ggplot(treesno.condition.zone,aes(x = reorder(Seed.Zone, -n),n,fill=Final.Health))+geom_col(position = position_dodge2(preserve = "single",reverse=TRUE))+theme_bw()+coord_flip()+ scale_y_continuous(breaks = c(0,25,50,75,100,125,150),expand = expansion(mult = c(0.05, 0.1))) +scale_fill_manual(values=c( "#009E73","#56B4E9","#E69F00","#CC79A7"))+labs(x="Site",y="Number of Trees",title ="Health Condition by Seed Zone", fill="Health Condition") +geom_text(aes(label=n,group=Final.Health),position = position_dodge2(width=0.9,preserve = "single",reverse=TRUE),hjust=-0.1) + theme(plot.title = element_text(hjust = 0.5))


The below plot shows the number of trees that fall under each health condition sorted by seed zone and planting site.

trees.condition <- trees %>% group_by(Site, Seed.Zone,Final.Health) %>% summarize(n=n_distinct(Temp.Tree.Number)) %>% filter(Final.Health!="NA")

trees.condition$Final.Health <- factor(trees.condition$Final.Health, levels=c('Alive','Dead','Dying','Missing'))

ggplot(trees.condition,aes(x = reorder(Site, -n),n,fill=Final.Health))+facet_wrap(~Seed.Zone)+geom_col(position = position_dodge2(preserve = "single",reverse=TRUE))+theme_bw()+coord_flip() + scale_y_continuous(expand = expansion(mult = c(0.05, 0.1))) +scale_fill_manual(values=c( "#009E73","#56B4E9","#E69F00","#CC79A7"))+labs(x="Site",y="Number of Trees", title = "Health Condition by Seed Zone and Site",fill="Health Condition") +geom_text(aes(label=n,group=Final.Health),position = position_dodge2(width=0.9,preserve = "single",reverse=TRUE),hjust=-0.1) + theme(plot.title = element_text(hjust = 0.5))


Data including browsed

The following plots, tables, and analysis includes all years’ measurements trees browsed by wildlife.

trees$Site <- as.factor(trees$Site)
trees$Seed.Zone <-as.factor(trees$Seed.Zone)
trees$Health <- as.factor(trees$Health)

trees.wide <- trees %>% pivot_wider(
    id_cols = c(Tree.Number, Site, Seed.Zone, New.Tree.Number),
    names_from = Measurement.Year,
    values_from = c(Tree.Height..cm., Tree.Diameter..mm.),
    names_glue = "{.value}_{Measurement.Year}") 

trees.wide.growth <- trees.wide %>% mutate(y1.height.growth = Tree.Height..cm._2023-Tree.Height..cm._2022, y2.height.growth = Tree.Height..cm._2024-Tree.Height..cm._2023, y3.height.growth = Tree.Height..cm._2025-Tree.Height..cm._2024, y1.diameter.growth = Tree.Diameter..mm._2023-Tree.Diameter..mm._2022, y2.diameter.growth = Tree.Diameter..mm._2024-Tree.Diameter..mm._2023, y3.diameter.growth = Tree.Diameter..mm._2025 - Tree.Diameter..mm._2024, total.height.growth = Tree.Height..cm._2025-Tree.Height..cm._2022, total.diameter.growth = Tree.Diameter..mm._2025-Tree.Diameter..mm._2022)

trees.wide.pos.total <- trees.wide.growth %>% filter(total.height.growth>0 & total.diameter.growth>0)
trees.wide.pos.y1 <- trees.wide.growth %>% filter(y1.height.growth>0 & y1.diameter.growth>0)
trees.wide.pos.y2 <- trees.wide.growth %>% filter(y2.height.growth>0 & y2.diameter.growth>0)
trees.wide.pos.y3 <- trees.wide.growth %>% filter(y3.height.growth>0 & y3.diameter.growth>0)
trees.wide.pos.all <- trees.wide.growth %>% filter(y1.height.growth>0 & y1.diameter.growth>0 &
  y2.height.growth>0 & y2.diameter.growth>0 & y3.height.growth>0 & y3.diameter.growth>0)
Number of Trees

The below table lists the number of trees that were remeasured in 2024 at each site, excluding outliers.

  • Note, this table only includes trees that had positive height and diameter growth. For example, some trees were heavily browsed in 2024 and therefore may be shorter than trees in 2023.
Site.Summary <- trees.wide.pos.all %>% group_by(Site,Seed.Zone) %>% summarize(n=n())
kable(Site.Summary[c(1,2,3)], col.names = c("Site", "Seed Zone", "Number of Trees")) %>% kable_material(c("striped", "hover","condensed"))
Site Seed Zone Number of Trees
Renton OR 14
Renton WA 32
Seattle OR 27
Seattle WA 33
Swan Creek OR 26
Swan Creek WA 19
Tomanamus OR 19
Tomanamus WA 10

Mean Height and Diameter Increase

The below table lists mean height and diameter increases between seed zones.

trees.summary <- trees.wide.pos.all %>% group_by(Seed.Zone)  %>% summarize(
n=n(),
mean.height.2025=mean(Tree.Height..cm._2025),
mean.diameter.2025=mean(Tree.Diameter..mm._2025),
mean.y1.height.growth=mean(y1.height.growth,na.rm=TRUE),
mean.y1.diameter.growth=mean(y1.diameter.growth,na.rm=TRUE),
mean.y2.height.growth=mean(y2.height.growth,na.rm=TRUE),
mean.y2.diameter.growth=mean(y2.diameter.growth,na.rm=TRUE),
mean.y3.diameter.growth=mean(y3.diameter.growth,na.rm=TRUE),
mean.y3.height.growth=mean(y3.height.growth,na.rm=TRUE),
mean.total.height.growth=mean(total.height.growth,na.rm=TRUE),
mean.total.diameter.growth=mean(total.diameter.growth,na.rm=TRUE))
library(knitr)
kable(trees.summary,col.names = c("Seed Zone", "Number of Trees", "2025 Mean Height (cm)", "2025 Mean Diameter (mm)", "Mean Year 1 Height Growth (cm)", "Mean Year 1 Diameter Growth (mm)", "Mean Year 2 Height Growth (cm)","Mean Year 2 Diameter Growth (mm)", "Mean Year 3 Height Growth (cm)","Mean Year 3 Diameter Growth (mm)", "Total Mean Height Growth (cm)","Total Mean Diameter Growth (mm)"), digits = 2,format = "html", table.attr='class="scrollable-table"') %>% kable_material(c("striped", "hover","condensed")) %>% kable_styling(full_width = F) %>% scroll_box(height = "300px")
Seed Zone Number of Trees 2025 Mean Height (cm) 2025 Mean Diameter (mm) Mean Year 1 Height Growth (cm) Mean Year 1 Diameter Growth (mm) Mean Year 2 Height Growth (cm) Mean Year 2 Diameter Growth (mm) Mean Year 3 Height Growth (cm) Mean Year 3 Diameter Growth (mm) Total Mean Height Growth (cm) Total Mean Diameter Growth (mm)
OR 86 156.80 32.38 8.41 3.70 31.55 9.97 9.89 34.01 73.97 23.56
WA 94 169.44 34.34 7.22 3.62 32.69 9.47 10.93 36.83 76.73 24.02

Trees from Oregon had a mean total height increase of 73.97cm and trees from Washington had a mean total height increase of 76.73cm.


Mean Increase by Site

The table below provides the same data, expect the means were calculated across seed zones and sites.

trees.summary.sites <- trees.wide.pos.all %>% group_by(Site,Seed.Zone)  %>% summarize(
n=n(),
mean.height.2025=mean(Tree.Height..cm._2025),
mean.diameter.2025=mean(Tree.Diameter..mm._2025),
mean.y1.height.growth=mean(y1.height.growth,na.rm=TRUE),
mean.y1.diameter.growth=mean(y1.diameter.growth,na.rm=TRUE),
mean.y2.height.growth=mean(y2.height.growth,na.rm=TRUE),
mean.y2.diameter.growth=mean(y2.diameter.growth,na.rm=TRUE),
mean.y3.diameter.growth=mean(y3.diameter.growth,na.rm=TRUE),
mean.y3.height.growth=mean(y3.height.growth, na.rm = TRUE),
mean.total.height.growth=mean(total.height.growth,na.rm=TRUE),
mean.total.diameter.growth=mean(total.diameter.growth,na.rm=TRUE))
library(knitr)
kable(trees.summary.sites, col.names = c("Site", "Seed Zone", "Number of Trees", "2025 Mean Height (cm)", "2025 Mean Diameter (mm)", "Mean Year 1 Height Growth (cm)", "Mean Year 1 Diameter Growth (mm)", "Mean Year 2 Height Growth (cm)","Mean Year 2 Diameter Growth (mm)", "Mean Year 3 Height Growth (cm)","Mean Year 3 Diameter Growth (mm)", "Total Mean Height Growth (cm)","Total Mean Diameter Growth (mm)"), digits = 2) %>% kable_material(c("striped", "hover","condensed")) %>% kable_styling(full_width = F) %>% scroll_box(height = "400px")
Site Seed Zone Number of Trees 2025 Mean Height (cm) 2025 Mean Diameter (mm) Mean Year 1 Height Growth (cm) Mean Year 1 Diameter Growth (mm) Mean Year 2 Height Growth (cm) Mean Year 2 Diameter Growth (mm) Mean Year 3 Height Growth (cm) Mean Year 3 Diameter Growth (mm) Total Mean Height Growth (cm) Total Mean Diameter Growth (mm)
Renton OR 14 146.29 20.76 7.93 2.81 26.21 3.12 4.94 26.86 61.00 10.87
Renton WA 32 168.19 24.49 7.80 2.73 31.31 4.48 6.40 33.50 72.61 13.61
Seattle OR 27 176.63 42.07 11.04 5.21 44.52 15.54 13.32 38.89 94.45 34.08
Seattle WA 33 180.18 44.90 8.76 5.26 41.58 14.56 15.88 40.82 91.15 35.71
Swan Creek OR 26 151.12 37.08 6.54 3.65 25.42 12.44 11.54 35.04 67.00 27.63
Swan Creek WA 19 161.21 39.43 4.46 3.33 23.53 12.25 12.86 40.21 68.20 28.44
Tomanamus OR 19 144.16 20.74 7.58 2.28 25.42 3.73 6.39 30.95 63.95 12.40
Tomanamus WA 10 153.60 21.34 5.51 1.64 25.15 3.37 5.41 27.90 58.56 10.42

Tree Height Increase

The below plots show the distributions in increases in tree height for each seed zone.

P1 <- ggplot(trees.wide.pos.all,aes(Seed.Zone,y1.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)", x= "Seed Source",title="Year 1 Growth") + theme(plot.title = element_text(hjust = 0.5))
P2 <- ggplot(trees.wide.pos.all,aes(Seed.Zone,y2.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)",x= "Seed Source",title="Year 2 Growth") + theme(plot.title = element_text(hjust = 0.5))
P3 <- ggplot(trees.wide.pos.all,aes(Seed.Zone,y3.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)",x= "Seed Source",title="Year 3 Growth") + theme(plot.title = element_text(hjust = 0.5))
P4 <- ggplot(trees.wide.pos.all,aes(Seed.Zone,total.height.growth,fill=Seed.Zone)) +geom_violin() +geom_boxplot() +theme_bw()+guides(fill="none") +scale_fill_manual(values=c("#E69F00", "#56B4E9")) +labs(y= "Height Growth (cm)",x= "Seed Source",title="Cumulative Growth") + theme(plot.title = element_text(hjust = 0.5))

height_plots <- P1 + P2 + P3 + P4
height_plots + plot_annotation(title = "Growth in Height (cm) by Year", theme = theme(plot.title = element_text(hjust = 0.5)))


The below plots show the distributions in increases in tree height for each seed zone and site.

ggplot(trees.wide.pos.all,aes(Seed.Zone,total.height.growth,fill=Site)) +geom_boxplot() +theme_bw() +scale_fill_manual(values=c("#E69F00", "#56B4E9", "#009E73","#9e0000")) + labs(y= "Total Height Growth (cm)",x= "Seed Source",title="Cumulative Height Growth by Site") + theme(plot.title = element_text(hjust = 0.5))

Mortality

The below plots show the number of trees that fall under each Health condition: alive, dead, or missing.

  • Note: Missing trees are classified as trees that were not found during re-measurements as of the most recent observation in 2025.
trees.condition.zone <- trees %>% group_by(Seed.Zone,Final.Health) %>% summarize(n=n_distinct(Temp.Tree.Number)) %>% filter(Final.Health!="NA")

ggplot(trees.condition.zone,aes(x = reorder(Seed.Zone, -n),n,fill=Final.Health))+geom_col(position = position_dodge2(preserve = "single",reverse=TRUE))+theme_bw()+coord_flip()+ scale_y_continuous(breaks = c(0,25,50,75,100,125,150),expand = expansion(mult = c(0.05, 0.1))) +scale_fill_manual(values=c( "#009E73","#56B4E9","#E69F00","#CC79A7"))+labs(x="Site",y="Number of Trees",title ="Health Condition by Seed Zone", fill="Health Condition") +geom_text(aes(label=n,group=Final.Health),position = position_dodge2(width=0.9,preserve = "single",reverse=TRUE),hjust=-0.1) + theme(plot.title = element_text(hjust = 0.5))


The below plot shows the number of trees that fall under each health condition sorted by seed zone and planting site.

trees.condition <- trees %>% group_by(Site, Seed.Zone,Final.Health) %>% summarize(n=n_distinct(Temp.Tree.Number)) %>% filter(Final.Health!="NA")

trees.condition$Final.Health <- factor(trees.condition$Final.Health, levels=c('Alive','Dead','Dying','Missing'))

ggplot(trees.condition,aes(x = reorder(Site, -n),n,fill=Final.Health))+facet_wrap(~Seed.Zone)+geom_col(position = position_dodge2(preserve = "single",reverse=TRUE))+theme_bw()+coord_flip() + scale_y_continuous(expand = expansion(mult = c(0.05, 0.1))) +scale_fill_manual(values=c( "#009E73","#56B4E9","#E69F00","#CC79A7"))+labs(x="Site",y="Number of Trees", title = "Health Condition by Seed Zone and Site",fill="Health Condition") +geom_text(aes(label=n,group=Final.Health),position = position_dodge2(width=0.9,preserve = "single",reverse=TRUE),hjust=-0.1) + theme(plot.title = element_text(hjust = 0.5))