Forest Restoration Reduces Wildfire Risk and Increases Carbon Storage
Visualizing the benefits of different forest restoration practices in the Sierra Nevada
Data Science
Conservation Planning
Strategic Communication
Author
Olivia Hemond
Published
March 11, 2025
The Forests of the Sierra Nevada are in Trouble
110 million treesdied in the Sierra Nevada over a period of just three years (2014—2018) due to an unprecedented combination of drought, extreme wildfire, and bark beetle outbreaks, according to the Sierra Nevada Conservancy.
Driving through the winding mountain roads in Sequoia National Park, I rounded a bend and emerged into the desolate, charred remains of a forest. The KNP Complex Fire had burned through this area over a period of three months in late 2021, leaving only the skeletons of trees in its wake. This series of wildfires killed thousands of endangered giant sequoias and cost over $170 million to finally put out.
These fires were particularly devastating because bark beetle outbreaks and severe drought had killed many trees in the years prior. Dead trees dry out quickly in the mountains, and effectively served as kindling that easily went up in flames as a lightning storm struck.
Trees in the Sierra are typically accustomed to, and even benefit from, fire. But when fires burn too hot and too big, even the giants of the forest can’t survive. Three years later, as I drove through what was left, I could not spot a single living tree. Only a thin layer of grass covered the forest floor.
While this event was extremely destructive, it is unfortunately not unique. Severe wildfires like the KNP Complex are becoming more and more common in the Sierras. These forests need our help, urgently.
(a)
(b)
Figure 1: View from my car window of the KNP Complex burn scar in 2024. Photos are my own.
What Can We Do?
Forest restoration describes a set of practices that seek to return a forest to a healthier, more resilient state. This involves removing excess trees and vegetation that are making the forest overcrowded and stressed. Just like how weeding a garden helps give plants the space and resources they need to thrive, forest restoration aims to “open up” the forest floor and promote healthy growth.
With this in mind, those in charge of managing a forest may choose from a few different options:
Prescribed burning, or the controlled application of fire to the landscape.
Mechanical thinning, or the removal of trees and other vegetation using forestry equipment.
Combining prescribed fire and mechanical thinning. Mechanically thin the forest first, and then conduct a prescribed burn.
For this project, I sought to answer the questions:
How well do these different forest restoration treatments actually work? Can they reduce overcrowding in our forests, decrease the likelihood of severe wildfire, AND protect the carbon that forests naturally sequester?
Any restoration practice that could achieve all three of these goals would be extremely valuable for future forest restoration efforts.
This paper presented the results of a long-term ecological research study on the impacts of different fuels treatment and forest restoration strategies in the Sierra Nevada. Plots in an experimental forest were randomly assigned to one of four different treatment options: prescribed fire, mechanical thinning, combined fire and mechanical thinning, and no treatment (control). Data collection occurred over a period of 18 years. The scientists measured vegetation characteristics, fuel amounts, and tree stand densities. They also conducted fire modeling to calculate the probability of torching (essentially, fire so severe that it scorches even the tops of trees) and the probability of tree mortality in each plot. Alongside this information, the data contains variables describing the treatment used, the plot ID number, the year, and whether the data were collected pre- or post-treatment.
As an ecologist and environmental scientist, I loved reading this paper. But for those who are less inclined to pore over academic writing, never fear! I translated their results into the infographic below to highlight the main findings that I found exciting.
Data Visualization as Science Communication
Final Infographic
Infographic showing the benefits and relative strengths of different forest restoration practices.
This infographic is made up of three individual plots that I created in R, then stitched together using Affinity Designer. Next, I’ll walk you through the steps I took to put this infographic together.
Set Up
Here I load the libraries I need, set up my color palette, load in custom fonts, and load in my data. Throughout this blog post, you can click to expand the code chunks for each individual step as you’d like.
Code
# ..........load libraries.........library(tidyverse)library(here)library(paletteer)library(scales)library(showtext)library(ggridges)#.........enable {showtext} for rendering...........showtext_auto()showtext_opts(dpi =300)# ........set color palette.........conifer <-paletteer_d("calecopal::conifer", n =5)# subset individual colors from palettetreatments <-c("Combined Thinning and Prescribed Fire"="#979A6BFF", "Prescribed Fire"="#CC7540FF", "Mechanical Thinning"="#39692FFF", "Control"="#765043FF")# ........add custom fonts.........font_add_google(name ="Montserrat", family ="montserrat")font_add_google(name ="Work Sans", family ="work sans")# ..........load data files.........# part A: stand density index# stand density index (SDI) sdi_data <-read_csv(here("posts", "2025-03-11-forest-restoration", "data", "sdi_data.csv")) # part B: fire risk# ptorch ptorch_data <-read_csv(here("posts", "2025-03-11-forest-restoration", "data", "ptorch_data.csv"))# part C: stable live tree carbon# stable live tree carbon (STLC) stlc_data <-read_csv(here("posts", "2025-03-11-forest-restoration", "data", "sltc_data.csv"))
Data Wrangling
I made sure to wrangle my data before making any plots. As the researchers had already cleaned the data prior to sharing it with the public, this step was fairly simple. I mainly had to convert my treatment variables to factors so that I could treat each restoration practice as a discrete category. This also allowed me to specify the order that these practices showed up in my plots.
Code
# Stand density indexsdi_clean <- sdi_data %>%# convert treatment and sdi_zone (competitive benchmark zones) to factors and set levelsmutate(treatment =factor(treatment, levels =c("control", "burn", "mech", "mechburn"),labels =c("Control", "Prescribed Fire", "Mechanical Thinning","Combined Thinning and Prescribed Fire")),sdi_zone_long =factor(sdi_zone,levels =c(">60", "35-60", "25-35", "<25"),labels =c("Extremely High", "High", "Moderate", "Low"))) # Ptorch (probability of torching, aka severe fire)ptorch_clean <- ptorch_data %>%# convert treatment to factor and set levelsmutate(treatment =factor(treatment, levels =c("mechburn", "burn", "mech", "control"),labels =c("Combined Thinning and Prescribed Fire", "Prescribed Fire", "Mechanical Thinning", "Control")))# Stable live tree carbon (contains information pre and post fire)stlc_clean <- stlc_data %>%# convert treatment to factor and set levelsmutate(treatment =factor(treatment, levels =c("mechburn", "burn", "mech", "control"),labels =c("Combined Thinning and Prescribed Fire", "Prescribed Fire", "Mechanical Thinning", "Control")))
Forest Density Lollipop Chart
My first figure answers the question:
Which restoration practices are best at reducing forest density? Reducing tree densities helps protect a forest against the impacts of drought, pests, and disease.
I created a lollipop chart showing the proportion of the forest that was considered “extremely high density” within each restoration practice. It is then possible to compare the amount of high density forest that results from each restoration option.
Code
# Process the data to calculate % of plots, for that treatment, in each SDI zonedensity_plot <- sdi_clean %>%# first, count number of plots in each treatment type and SDI benchmark zonegroup_by(treatment, sdi_zone_long) %>%summarize(count_treatment_zone =n()) %>%ungroup() %>%# second, add the counts to get the total number of plots in each treatment typegroup_by(treatment) %>%mutate(count_treatment =sum(count_treatment_zone),# third, divide the number of plots per SDI zone by the number of total plots for that treatment pct_zone_per_treatment = count_treatment_zone/count_treatment) %>%# filter to only extremely high density plotsfilter(sdi_zone_long =="Extremely High") %>%# set up ggplotggplot(aes(x = treatment, y = pct_zone_per_treatment, color = treatment)) +geom_point(size =5) +geom_linerange(aes(ymin =0, ymax = pct_zone_per_treatment), alpha =0.5,linewidth =2) +# wrap long labelsscale_x_discrete(labels =label_wrap(20)) +# add y axis limitsscale_y_continuous(limits =c(0, 0.75)) +# add colorsscale_color_manual(values = treatments) +# add title, subtitle, and y axis labellabs(title ="Decrease Dangerously High Density",subtitle ="Without restoration, most of the forest is overcrowded and faces\na greater risk of death and disease",caption ="Data from Stephens et al. 2023.",y ="Percent of Plots") +# add percent labels to each linegeom_text(aes(label = scales::percent(pct_zone_per_treatment, scale =100,accuracy =1)), hjust =-0.35, vjust =-0.35,size =5,family ="work sans") +# apply themeingtheme(# remove legendlegend.position ="none",# remove axis titles and axes themselvesaxis.title =element_blank(),panel.background =element_blank(),axis.text.y =element_blank(),axis.ticks =element_blank(),#adjust title, subtitle, axis textplot.title =element_text(family ="montserrat",face ="bold",size =16,hjust =0,margin =margin(10, 0, 10, 0)),plot.subtitle =element_text(family ="work sans",size =14,hjust =0,margin =margin(0, 0, 10, 0)),axis.text =element_text(family ="work sans",size =14),# adjust captionplot.caption =element_text(family ="work sans",face ="italic", color ="#484848",size =11,hjust =1,margin =margin(20, 0, 10, 0)) )density_plot
Wildfire Ridgeline Plot
My second figure answers the question:
Which restoration practices are best at reducing the risk of severe fire?
I created a ridgeline plot to visualize the distribution of ptorch values for each restoration practices. Remember that the probability of torching essentially represents the probability of that forest experiencing a severe wildfire (if a fire were to burn, would it be severe?). The median values are marked by vertical lines within the ridges, and the individual points, representing individual forest plots, are shown in a “raincloud” formation below each ridge.
Code
fire_plot <- ptorch_clean %>%ggplot(aes(x = ptorch, y = treatment, fill = treatment)) +# create rideline plot with raincloud of points underneath. use quantile line to mark median valuegeom_density_ridges(aes(point_color = treatment),scale =0.8, alpha =0.8,rel_min_height =0.02,jittered_points =TRUE, quantile_lines =TRUE, linewidth =0.8,vline_width =0.8, vline_color ="black",point_size =0.4, point_alpha =0.6, position ="raincloud",quantiles =2) +# wrap long labels on y axisscale_y_discrete(labels =label_wrap(20)) +# apply fill colorsscale_fill_manual(values = treatments) +# apply point colorsscale_discrete_manual("point_color", values = treatments) +# add title and axis labellabs(title ="Reduce Risk of Severe Wildfire",subtitle ="Without restoration, forests face a much greater risk of severe wildfire",caption ="Data from Stephens et al. 2023.",x ="Probability of Severe Wildfire") +# add percent labelsscale_x_continuous(labels = scales::percent_format(accuracy =1)) +# add themeingtheme_classic() +theme(# remove legend and y axis titlelegend.position ="none",axis.title.y =element_blank(),#adjust title, subtitle, axis textplot.title =element_text(family ="montserrat",face ="bold", size =16,hjust =1,margin =margin(10, 0, 10, 0)),plot.subtitle =element_text(family ="work sans",size =14,hjust =1,margin =margin(0, 0, 15, 0)),axis.text =element_text(family ="work sans",size =12,margin =margin(10, 0, 0, 0)),axis.title.x =element_text(family ="work sans",face ="bold",color ="#484848",size =14,margin =margin(15, 0, 0, 0)),# adjust captionplot.caption =element_text(family ="work sans",face ="italic", color ="#484848",size =11,hjust =1,margin =margin(20, 0, 10, 0)) )fire_plot
Forest Carbon Slope Chart
My third and final figure answers the question:
Which restoration practices are best at protecting forest carbon stocks?
To answer this, I created a slope chart showing the carbon stored by forests under each restoration treatment. I wanted to show how the carbon stored would decrease after a wildfire went through. This connects to the wildfire chart above, as severe wildfire will release more carbon to the atmosphere than low-intensity wildfire. Note that these carbon values are averages, and that they represent on the carbon stored by live trees, and not any carbon stored in the soil belowground or in other types of vegetation.
Code
# first, calculate the mean stlc and mean existing carbon for each treatment typecarbon_plot <- stlc_clean %>%group_by(treatment) %>%summarize(mean_carbon_mgha =mean(carbon_mgha),mean_stable_ltc_mgha =mean(stable_ltc_mgha)) %>%pivot_longer(mean_carbon_mgha:mean_stable_ltc_mgha,names_to ="carbon_type",values_to ="carbon_mgha") %>%# now create slope chartggplot(aes(x = carbon_type, y = carbon_mgha, color = treatment, group = treatment)) +# add vertical lines as backgroundgeom_vline(xintercept =1, color ="lightgray", linetype ="dashed") +geom_vline(xintercept =2, color ="lightgray", linetype ="dashed") +geom_point(size =3) +# add lines connecting the pointsgeom_line() +# add number labels to each line (showing carbon in mg/ha)geom_text(aes(label =round(carbon_mgha, 0)), hjust =-0.2, vjust =-0.2,size =4.5,family ="work sans") +# add annotations to label each line with the treatment group nameannotate(geom ="text",x =0.88, y =228,size =14/ .pt,label ="Control",color ="#765043FF") +annotate(geom ="text",x =0.78, y =170,size =14/ .pt,label ="Prescribed Fire",color ="#CC7540FF") +annotate(geom ="text",x =0.7, y =164,size =14/ .pt,label ="Mechanical Thinning",color ="#39692FFF") +annotate(geom ="text",x =0.7, y =126,size =14/ .pt,label ="Combined Thinning\nand Prescribed Fire",color ="#979A6BFF") +# apply color palette based upon treatmentscale_color_manual(values = treatments) +# change x axis labelsscale_x_discrete(labels =c("Pre-Fire", "Post-Fire")) +labs(title ="Preserve Forest Carbon Stocks",subtitle ="Unrestored forests risk losing a large amount\nof their stored carbon",caption ="Data from Stephens et al. 2023.") +theme(# remove legend, gridlines, axis lines, axis titleslegend.position ="none",panel.background =element_blank(),axis.text.y =element_blank(),axis.ticks =element_blank(),axis.title =element_blank(),#adjust title, subtitle, and axis textplot.title.position ="panel",plot.title =element_text(family ="montserrat",face ="bold", hjust =0,size =16,margin =margin(10, 0, 10, 0)),plot.subtitle =element_text(family ="work sans",size =14,hjust =0,margin =margin(0, 0, 20, 0)),axis.text.x =element_text(family ="work sans",face ="bold",color ="#484848",size =14,margin =margin(10, 0, 0, 0)),# adjust captionplot.caption =element_text(family ="work sans",face ="italic", color ="#484848",size =12,hjust =0.7,margin =margin(20, 0, 10, 0)) )carbon_plot
Putting it All Together
To create the final infographic, I saved each plot I made and combined them using Affinity Designer, a vector graphic design software akin to Adobe Illustrator. I used this software to add additional graphics and annotations, including visual depictions of some of the forest ecology concepts I describe (such as forest density and carbon loss). I also made small aesthetic tweaks to font sizes, colors, and fontface as needed.
Design Elements
It is essential to explicitly consider different design elements when creating an infographic. I wanted my visualizations to tie in to each other and tell a clear story. So, I wanted to explain my thinking and the rationale behind my choices for each of the ten essential design elements listed below. If you are planning to create your own infographic, make sure you keep these in mind!
Graphic Form: I used three different graphic forms for my plots: a lollipop chart, a ridgeline plot, and a slope chart. I wanted to use a variety of charts, and pick some that were slightly out of the ordinary, but still keep them simple and effective. I felt like the lollipop chart was essentially a fun spin on a bar chart, and would be very easy to read and understand the message of. The slope chart idea came to me after I first played around with some dumbbell plots but didn’t quite like the look of them. I like how the slope chart shows the “change in time”, in a way, on the x axis, and the “change in amount” on the y axis. After making those two charts, I knew I wanted my wildfire chart to have minimal straight lines so that it would be visually different from the other two. I tried boxplot and violin charts before finally settling on the ridgeline design. I liked that I could still show the median value, and the density of the data in two ways (through the ridgeline and the raincloud of points below).
Text: In each of my stand alone plots, I included a title, subtitle, caption, and axis text and labels where appropriate. I removed any legends and axis text that I could in order to simplify the design. When I combined the plots together in the infographic, I further moved and removed text wherever possible. For instance, I changed all of the subtitles to be annotations on the plots, and I removed the restoration practices axis text and replaced them with the corresponding icons. I also removed the individual data credit captions, and replaced them with one single caption at the bottom right of the infographic. I did this to reduce the reading burden on a viewer, and to make sure the text I did need to include would be that much more attention grabbing. I also added small diagrams and additional text boxes to describe aspects of forest ecology that were essential to a viewer’s understanding of the concepts captured by the data.
Themes: I chose to keep plot themes simple and minimal as much as possible. This included removing legends and axis text, as mentioned above, as well as axis lines and background grids. I found that most of these elements were not necessary to convey meaning, and could often be replaced by just adding numerical labels onto the plot itself. Similarly, I wanted the overall theme of the infographic to be simple, neutral and earthy. I used a very light shade of brown for the background, slightly darker shades of brown to highlight some regions of text, and kept additional forest graphics as black silhouettes.
Colors: I used colors from the calecopal package, specifically from the conifer palette. This palette was created to mimic the natural colors found in California conifer forests, so it was an ideal fit for the subject matter of my visualizations. I picked four distinct colors from this palette so that they would be easily distinguishable. I decided to use color only to differentiate between the different restoration practices. Since I knew each of my visualizations would contain all four practices, I felt that the use of color would make it easier for a viewer to interpret these graphs separately and view them all together. In effect, the consistent use of colors helps my audience follow the thread of the story throughout my infographic.
Typography: I chose to use two fonts throughout my infographic. Montserrat I used for the main title and the title of each plot. All other text was displayed using Work Sans. These fonts are both sans serif, which aids their readability on a screen. I also chose them because they were simple, calm, and composed. Beyond these fonts, I also chose to use italics and bolding to emphasize or de-emphasize certain text. For instance, I italicized the author and data attributions at the bottom of the infographic so that they would not be overly eye-catching. I used bolding in some of my annotations, along with color, to draw attention to the specific restoration practice that I was talking about.
General Design: I wanted the viewer’s eyes to generally move from the top to the bottom of the visualization. I presented the title, background, and icons for each restoration practice up at the very top of the page, so that they would be viewed first. I then started with the forest density plot in the top left, moved towards the wildfire plot in the middle right, and ended with the carbon stocks plot on the bottom left. I wanted viewers to be able to connect these ideas to each other: forests with high densities of trees are more susceptible to severe fire (among other threats). Forests at risk of severe fire are more likely to lose a greater amount of their stored carbon, because of the loss of more trees. I provided small graphics to illustrate these concepts in the top right and bottom right of the infographic. I tried to keep enough spacing between figures, text, and other graphics so that it would not feel too crowded. And while I generally wanted the viewer’s eyes to move downwards, zigzagging through the infographic, I didn’t want to overly prescribe this path by using too many arrows or by numbering the different plots. Instead, I hope I struck a balance between giving them a general direction to read through, and giving them room to explore and move between pieces of information as they wish.
Contextualizing Data: I contextualized the data in both the header, the forestry graphics, and the plot annotations. I spent a lot of time throughout this project figuring out how to simplify these forest ecology concepts and remove jargon so that it would be understandable to a broader audience. Some words, such as “forest density” and “carbon” were just too essential to the story to be removed, so these I clarified through the use of my drawings and text blurbs. I also used the annotations on the plots themselves to pull out the main points for the viewer.
Centering Primary Message: My primary message was that any of these restoration practices would produce significantly better outcomes than taking no action. Yes, there was also some nuance and tradeoffs between the different practices, some of which I pointed out. But in general, I wanted a viewer to understand that restoration is necessary and that this is why: it helps decrease forest densities, it helps reduce severe wildfires, and it helps store more stable carbon. To make this point clear, I made sure that the title of each plot captured that takeaway, in short and concise wording. I also made an annotation on each plot describing how poorly the “no restoration” option performed. I did all of this in combination with simply framing the message with my title, which highlights the “benefits of forest restoration”.
Considering Accessibility: As mentioned above, I wanted to use colors from the conifer palette to represent the conifer forests of the Sierra Nevada. The colors I chose are distinguishable to those with “normal” color vision but harder to tell apart for those with color blindness. This is because they fall within the orange, green, and brown parts of the spectrum, which are less easily distinguished by people with red-green color blindness. To balance the use of these colors with accessibility concerns, I made sure my labeling was redundant of my color choices. I did this by including the icons describing each restoration practice on all three of my plots, in conjunction with the colors. That way, even someone who perceives the colors differently from myself can identify the practices based on the unique icons and the key for each that I included in the heading.
Diversity, Equity, and Inclusion (DEI): DEI is essential to consider for any data that depicts people, places, and communities. However, I did not end up incorporating a DEI lens into this piece of work because of the nature of my data. This data solely described physical characteristics of forests, and did not address any aspect of the people who may be nearby or involved in their management. Thus, there was not a DEI context to consider in this instance, but I would urge you to always consider whether DEI needs to be included in your own visualizations!
Presentation Slides
I also created a presentation to showcase a modified version of this data visualization. This presentation is tailored to informed but non-expert audiences, and is designed to be presented in a 12-minute time slot.
Additionally, I created a short version: one slide, which goes along with a 3-minute flash talk.
Data Citation
Stephens, S. L., Foster, D. E., Battles, J. J., Bernal, A. A., Collins, B. M., Hedges, R., Moghaddas, J. J., Roughton, A. T., & York, R. A. (2023). Forest restoration and fuels reduction work: Different pathways for achieving success in the Sierra Nevada. Ecological Applications, 34(2). https://doi.org/10.1002/eap.2932
If you are curious, expand the code below to see the compiled code for the entire project.
Code
### Set Up# ..........load libraries.........library(tidyverse)library(here)library(paletteer)library(scales)library(showtext)library(ggridges)#.........enable {showtext} for rendering...........showtext_auto()showtext_opts(dpi =300)# ........set color palette.........conifer <-paletteer_d("calecopal::conifer", n =5)# subset individual colors from palettetreatments <-c("Combined Thinning and Prescribed Fire"="#979A6BFF", "Prescribed Fire"="#CC7540FF", "Mechanical Thinning"="#39692FFF", "Control"="#765043FF")# ........add custom fonts.........font_add_google(name ="Montserrat", family ="montserrat")font_add_google(name ="Work Sans", family ="work sans")# ..........load data files.........# part A: stand density index# stand density index (SDI) sdi_data <-read_csv(here("posts", "2025-03-11-forest-restoration", "data", "sdi_data.csv")) # part B: fire risk# ptorch ptorch_data <-read_csv(here("posts", "2025-03-11-forest-restoration", "data", "ptorch_data.csv"))# part C: stable live tree carbon# stable live tree carbon (STLC) stlc_data <-read_csv(here("posts", "2025-03-11-forest-restoration", "data", "sltc_data.csv"))### Data Wrangling# Stand density indexsdi_clean <- sdi_data %>%# convert treatment and sdi_zone (competitive benchmark zones) to factors and set levelsmutate(treatment =factor(treatment, levels =c("control", "burn", "mech", "mechburn"),labels =c("Control", "Prescribed Fire", "Mechanical Thinning","Combined Thinning and Prescribed Fire")),sdi_zone_long =factor(sdi_zone,levels =c(">60", "35-60", "25-35", "<25"),labels =c("Extremely High", "High", "Moderate", "Low"))) # Ptorch (probability of torching, aka severe fire)ptorch_clean <- ptorch_data %>%# convert treatment to factor and set levelsmutate(treatment =factor(treatment, levels =c("mechburn", "burn", "mech", "control"),labels =c("Combined Thinning and Prescribed Fire", "Prescribed Fire", "Mechanical Thinning", "Control")))# Stable live tree carbon (contains information pre and post fire)stlc_clean <- stlc_data %>%# convert treatment to factor and set levelsmutate(treatment =factor(treatment, levels =c("mechburn", "burn", "mech", "control"),labels =c("Combined Thinning and Prescribed Fire", "Prescribed Fire", "Mechanical Thinning", "Control")))### Forest Density Lollipop Chart# Process the data to calculate % of plots, for that treatment, in each SDI zonedensity_plot <- sdi_clean %>%# first, count number of plots in each treatment type and SDI benchmark zonegroup_by(treatment, sdi_zone_long) %>%summarize(count_treatment_zone =n()) %>%ungroup() %>%# second, add the counts to get the total number of plots in each treatment typegroup_by(treatment) %>%mutate(count_treatment =sum(count_treatment_zone),# third, divide the number of plots per SDI zone by the number of total plots for that treatment pct_zone_per_treatment = count_treatment_zone/count_treatment) %>%# filter to only extremely high density plotsfilter(sdi_zone_long =="Extremely High") %>%# set up ggplotggplot(aes(x = treatment, y = pct_zone_per_treatment, color = treatment)) +geom_point(size =5) +geom_linerange(aes(ymin =0, ymax = pct_zone_per_treatment), alpha =0.5,linewidth =2) +# wrap long labelsscale_x_discrete(labels =label_wrap(20)) +# add y axis limitsscale_y_continuous(limits =c(0, 0.75)) +# add colorsscale_color_manual(values = treatments) +# add title, subtitle, and y axis labellabs(title ="Decrease Dangerously High Density",subtitle ="Without restoration, most of the forest is overcrowded and faces\na greater risk of death and disease",caption ="Data from Stephens et al. 2023.",y ="Percent of Plots") +# add percent labels to each linegeom_text(aes(label = scales::percent(pct_zone_per_treatment, scale =100,accuracy =1)), hjust =-0.35, vjust =-0.35,size =5,family ="work sans") +# apply themeingtheme(# remove legendlegend.position ="none",# remove axis titles and axes themselvesaxis.title =element_blank(),panel.background =element_blank(),axis.text.y =element_blank(),axis.ticks =element_blank(),#adjust title, subtitle, axis textplot.title =element_text(family ="montserrat",face ="bold",size =16,hjust =0,margin =margin(10, 0, 10, 0)),plot.subtitle =element_text(family ="work sans",size =14,hjust =0,margin =margin(0, 0, 10, 0)),axis.text =element_text(family ="work sans",size =14),# adjust captionplot.caption =element_text(family ="work sans",face ="italic", color ="#484848",size =11,hjust =1,margin =margin(20, 0, 10, 0)) )density_plot### Wildfire Ridgeline Plotfire_plot <- ptorch_clean %>%ggplot(aes(x = ptorch, y = treatment, fill = treatment)) +# create rideline plot with raincloud of points underneath. use quantile line to mark median valuegeom_density_ridges(aes(point_color = treatment),scale =0.8, alpha =0.8,rel_min_height =0.02,jittered_points =TRUE, quantile_lines =TRUE, linewidth =0.8,vline_width =0.8, vline_color ="black",point_size =0.4, point_alpha =0.6, position ="raincloud",quantiles =2) +# wrap long labels on y axisscale_y_discrete(labels =label_wrap(20)) +# apply fill colorsscale_fill_manual(values = treatments) +# apply point colorsscale_discrete_manual("point_color", values = treatments) +# add title and axis labellabs(title ="Reduce Risk of Severe Wildfire",subtitle ="Without restoration, forests face a much greater risk of severe wildfire",caption ="Data from Stephens et al. 2023.",x ="Probability of Severe Wildfire") +# add percent labelsscale_x_continuous(labels = scales::percent_format(accuracy =1)) +# add themeingtheme_classic() +theme(# remove legend and y axis titlelegend.position ="none",axis.title.y =element_blank(),#adjust title, subtitle, axis textplot.title =element_text(family ="montserrat",face ="bold", size =16,hjust =1,margin =margin(10, 0, 10, 0)),plot.subtitle =element_text(family ="work sans",size =14,hjust =1,margin =margin(0, 0, 15, 0)),axis.text =element_text(family ="work sans",size =12,margin =margin(10, 0, 0, 0)),axis.title.x =element_text(family ="work sans",face ="bold",color ="#484848",size =14,margin =margin(15, 0, 0, 0)),# adjust captionplot.caption =element_text(family ="work sans",face ="italic", color ="#484848",size =11,hjust =1,margin =margin(20, 0, 10, 0)) )fire_plot### Forest Carbon Slope Chart# first, calculate the mean stlc and mean existing carbon for each treatment typecarbon_plot <- stlc_clean %>%group_by(treatment) %>%summarize(mean_carbon_mgha =mean(carbon_mgha),mean_stable_ltc_mgha =mean(stable_ltc_mgha)) %>%pivot_longer(mean_carbon_mgha:mean_stable_ltc_mgha,names_to ="carbon_type",values_to ="carbon_mgha") %>%# now create slope chartggplot(aes(x = carbon_type, y = carbon_mgha, color = treatment, group = treatment)) +# add vertical lines as backgroundgeom_vline(xintercept =1, color ="lightgray", linetype ="dashed") +geom_vline(xintercept =2, color ="lightgray", linetype ="dashed") +geom_point(size =3) +# add lines connecting the pointsgeom_line() +# add number labels to each line (showing carbon in mg/ha)geom_text(aes(label =round(carbon_mgha, 0)), hjust =-0.2, vjust =-0.2,size =4.5,family ="work sans") +# add annotations to label each line with the treatment group nameannotate(geom ="text",x =0.88, y =228,size =14/ .pt,label ="Control",color ="#765043FF") +annotate(geom ="text",x =0.78, y =170,size =14/ .pt,label ="Prescribed Fire",color ="#CC7540FF") +annotate(geom ="text",x =0.7, y =164,size =14/ .pt,label ="Mechanical Thinning",color ="#39692FFF") +annotate(geom ="text",x =0.7, y =126,size =14/ .pt,label ="Combined Thinning\nand Prescribed Fire",color ="#979A6BFF") +# apply color palette based upon treatmentscale_color_manual(values = treatments) +# change x axis labelsscale_x_discrete(labels =c("Pre-Fire", "Post-Fire")) +labs(title ="Preserve Forest Carbon Stocks",subtitle ="Unrestored forests risk losing a large amount\nof their stored carbon",caption ="Data from Stephens et al. 2023.") +theme(# remove legend, gridlines, axis lines, axis titleslegend.position ="none",panel.background =element_blank(),axis.text.y =element_blank(),axis.ticks =element_blank(),axis.title =element_blank(),#adjust title, subtitle, and axis textplot.title.position ="panel",plot.title =element_text(family ="montserrat",face ="bold", hjust =0,size =16,margin =margin(10, 0, 10, 0)),plot.subtitle =element_text(family ="work sans",size =14,hjust =0,margin =margin(0, 0, 20, 0)),axis.text.x =element_text(family ="work sans",face ="bold",color ="#484848",size =14,margin =margin(10, 0, 0, 0)),# adjust captionplot.caption =element_text(family ="work sans",face ="italic", color ="#484848",size =12,hjust =0.7,margin =margin(20, 0, 10, 0)) )carbon_plot
Citation
BibTeX citation:
@online{hemond2025,
author = {Hemond, Olivia},
title = {Forest {Restoration} {Reduces} {Wildfire} {Risk} and
{Increases} {Carbon} {Storage}},
date = {2025-03-11},
url = {https://ohemond25.github.io/oliviahemond.github.io/posts/2025-03-11-forest-restoration},
langid = {en}
}