###
# SETUP: load the packages, read the two data sources, tidy them and prepare the numbers
# used in the text. Everything below runs once, before any chart is drawn.
###

# knitr options: show the code (it is folded by default), but hide messages and warnings
knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)

# Packages used in this project
library(dplyr)    # data wrangling (filter, group_by, summarise, joins)
library(tidyr)    # complete() fills in missing year/cause combinations
library(readxl)   # reads the Global Forest Watch Excel workbook
library(readr)    # reads the FAO csv file
library(plotly)   # interactive charts

# Text size used in every chart (the font itself is the same theme font)
fnt <- list(size = 12)

# ---- 1. DATA SOURCES 
# Source A: Global Forest Watch (WRI / University of Maryland), country data download,
#           version v20260427. Tree-cover loss by year and by main driver (cause).
#           File location: data/global.xlsx
# Source B: FAO Global Forest Resources Assessment 2025, forest area by country (1000 ha)
#           for 1990-2025. File location: data/fra2025_forest_area.csv
f   <- "data/global.xlsx"
fra <- read_csv("data/fra2025_forest_area.csv", show_col_types = FALSE)

# Tree-cover loss by main driver, national level, 30% canopy density, years 2001-2025
drv <- read_excel(f, sheet = "Country drivers") %>% filter(threshold == 30)

# Tree-cover extent in 2000 for each country (used to express loss as a % of the 2000 cover)
ext <- read_excel(f, sheet = "Country tree cover loss") %>% filter(threshold == 30) %>%
  group_by(country) %>%
  summarise(extent_2000_ha = sum(extent_2000_ha), .groups = "drop")  # a few countries are listed in two parts

# ---- 2. GROUP THE CAUSES -------------------------------------------------------------
# GFW has seven drivers. They are grouped into six readable groups, and the two groups that
# usually remove forest for good (farms, mines and settlements) are marked as "permanent".
drv <- drv %>% mutate(
  group = case_when(
    driver == "Permanent agriculture" ~ "Permanent agriculture",
    driver %in% c("Hard commodities", "Settlements & Infrastructure") ~ "Mining and settlements",
    driver == "Wildfire" ~ "Wildfire",
    driver == "Logging" ~ "Logging",
    driver == "Shifting cultivation" ~ "Shifting cultivation",
    TRUE ~ "Other natural disturbances"),
  permanent = group %in% c("Permanent agriculture", "Mining and settlements"))

# Colour for each cause (the same colours are used in every chart)
pal <- c(`Permanent agriculture` = "#b2182b", `Mining and settlements` = "#7b5ea7", Wildfire = "#f28e2b",
         Logging = "#8c6d46", `Shifting cultivation` = "#59a14f", `Other natural disturbances` = "#9aa5b1")

# ---- 3. SUMMARY TABLES 
# Loss by country, year and cause
by_cy <- drv %>% group_by(country, year, group) %>% summarise(ha = sum(tc_loss_ha), .groups = "drop")
# World loss by year and cause
yr <- drv %>% group_by(year, group) %>% summarise(ha = sum(tc_loss_ha), .groups = "drop")
# Total loss per country and the share of it that was permanent conversion
tot_country <- drv %>% group_by(country) %>%
  summarise(total = sum(tc_loss_ha), perm = sum(tc_loss_ha[permanent]), .groups = "drop") %>%
  mutate(perm_share = perm / total * 100)
# The 15 countries with the most loss
top15 <- tot_country %>% slice_max(total, n = 15)

# ---- 4. NUMBERS USED IN THE TEXT 
m  <- function(x) format(round(x / 1e6, 1), nsmall = 1)    # hectares -> million hectares (text)
sh <- function(ct, g) {                                    # % of a country's loss caused by group g
  x <- by_cy %>% filter(country == ct)
  round(sum(x$ha[x$group == g]) / sum(x$ha) * 100)
}
tot_year  <- drv %>% group_by(year) %>% summarise(ha = sum(tc_loss_ha))
peak      <- tot_year %>% slice_max(ha, n = 1)                       # year with the most loss
fire      <- yr %>% filter(group == "Wildfire")
fire_ha   <- function(y) fire$ha[fire$year == y]
fire_early <- mean(fire$ha[fire$year <= 2005])                       # average yearly fire loss 2001-2005
fire_late  <- mean(fire$ha[fire$year >= 2021])                       # average yearly fire loss 2021-2025
drv_share <- drv %>% group_by(group) %>% summarise(ha = sum(tc_loss_ha)) %>% mutate(p = ha / sum(ha) * 100)
dshare    <- function(g) round(drv_share$p[drv_share$group == g])    # % of all loss caused by group g
perm_all  <- round(sum(drv_share$p[drv_share$group %in% c("Permanent agriculture", "Mining and settlements")]))
top5       <- tot_country %>% slice_max(total, n = 5)
top5_share <- round(sum(top5$total) / sum(tot_country$total) * 100)  # share of world loss in the top 5 countries
aus     <- by_cy %>% filter(country == "Australia") %>% group_by(year) %>% summarise(ha = sum(ha))
aus_typ <- median(aus$ha[!aus$year %in% c(2019, 2020)])              # typical Australian year (not the fire years)

# ---- 5. JOIN THE TWO SOURCES 
# Country names are spelled differently in the two sources, so the differences are matched by hand.
nm <- c(Bolivia = "Bolivia (Plurinational State of)", Brunei = "Brunei Darussalam", CaboVerde = "Cabo Verde",
        CaymanIslands = "Cayman Islands", `Falkland Islands` = "Falkland Islands (Malvinas)", Iran = "Iran (Islamic Republic of)",
        IsleofMan = "Isle of Man", Laos = "Lao People's Democratic Republic", Micronesia = "Micronesia (Federated States of)",
        Moldova = "Republic of Moldova", Nauru = "Naoero", Netherlands = "Netherlands (Kingdom of the)",
        `North Korea` = "Democratic People's Republic of Korea", `Republic of the Congo` = "Congo", Russia = "Russian Federation",
        `South Korea` = "Republic of Korea", Swaziland = "Eswatini", Syria = "Syrian Arab Republic",
        Tanzania = "United Republic of Tanzania", Turkey = "Türkiye",
        `United Kingdom` = "United Kingdom of Great Britain and Northern Ireland", `United States` = "United States of America",
        Venezuela = "Venezuela (Bolivarian Republic of)", Vietnam = "Viet Nam")

# allc = every country found in both sources, with loss (GFW) and forest-area change (FAO)
allc <- tot_country %>% left_join(ext, by = "country") %>%
  mutate(fra_name = ifelse(country %in% names(nm), nm[country], country),
         fra_name = ifelse(grepl("xico$", country), "Mexico", fra_name)) %>%   # Mexico has an accent in GFW
  inner_join(fra, by = c(fra_name = "name")) %>%
  mutate(loss_pct = total / extent_2000_ha * 100,   # gross loss 2001-2025 as % of 2000 tree cover (GFW)
         net_pct  = (y2025 / y2000 - 1) * 100,      # net change in forest area 2000-2025, % (FAO)
         net_mha  = (y2025 - y2000) / 1000)         # net change in forest area, million hectares (FAO)

# cmp = countries with at least 1 million ha of forest in both sources (used in chart 5 and the text)
cmp   <- allc %>% filter(extent_2000_ha >= 1e6, y2000 * 1000 >= 1e6)
n_cmp <- nrow(cmp)
hi    <- cmp %>% filter(loss_pct > 10)                       # countries that lost more than 10% of their 2000 cover
hi_n  <- nrow(hi); hi_ok <- sum(hi$net_pct >= 0)             # ...and how many of them still did not lose forest area
cv    <- function(ct, v) cmp[[v]][cmp$country == ct]         # look up one value for one country

# ---- 6. SOURCE LINES shown under the charts 
src  <- "Data source: Global Forest Watch / World Resources Institute (2026), tree-cover loss and drivers, 30% canopy density, 2001-2025."
src5 <- "Data sources: Global Forest Watch / World Resources Institute (2026), tree-cover loss 2001-2025 at 30% canopy density; Food and Agriculture Organization of the United Nations (2025), Global Forest Resources Assessment 2025, forest area in 2000 and 2025."

Introduction

Satellite data can show how much tree cover disappears each year. In 2016, the largest annual loss in this dataset was recorded, at 29.6 million hectares. However, a reduction in tree cover does not always mean that forest has been permanently removed. For example, some areas affected by fire may regrow, while land cleared for agriculture may remain non-forested.

This report compares countries tree-cover loss with changes in their total forest area. It uses two sources: satellite-based tree-cover loss estimates from Global Forest Watch and forest-area statistics published by the Food and Agriculture Organization of the United Nations (FAO). Comparing these measures helps show why tree-cover loss and changes in total forest area may tell different stories.

1. Global patterns in tree-cover loss

The bars show annual tree-cover loss grouped by its main reported driver. In this dataset, wildfire-related loss changed from 2.5 million hectares in 2001 to 13.8 million hectares in 2024. Across the full period, permanent agriculture accounted for 32% of recorded loss, compared with 30% for wildfire and 25% for logging.

# Chart 1: stacked bars, one bar per year, one colour per cause
fig <- plot_ly()
for (g in names(pal)) {
  d <- yr %>% filter(group == g)                         # loss caused by this group, all years
  fig <- fig %>% add_bars(x = d$year, y = d$ha / 1e6, name = g, marker = list(color = pal[[g]]),
                          hovertemplate = paste0(g, ": %{y:.1f} Mha<extra>%{x}</extra>"))
}
fig %>% layout(barmode = "stack", title = "Global tree-cover loss by main cause, 2001-2025",
  font = fnt,
  xaxis = list(title = ""), yaxis = list(title = "Million hectares per year"),
  hovermode = "x unified", legend = list(orientation = "h", y = -0.15), margin = list(t = 90),
  # grey band: years when satellite detection methods improved (2011-2015)
  shapes = list(list(type = "rect", xref = "x", yref = "paper", x0 = 2010.5, x1 = 2015.5, y0 = 0, y1 = 1,
                     fillcolor = "rgba(120,120,120,0.12)", line = list(width = 0), layer = "below")),
  annotations = list(list(x = 2013, y = 1.0, xref = "x", yref = "paper", showarrow = FALSE, yanchor = "bottom",
                          text = "Detection methods improved", font = list(size = 11, color = "#666"))))

What the chart shows: Annual global tree-cover loss, separated by the main driver recorded in the dataset. A taller bar indicates a larger area of loss. How to use the chart: Hover over the bars to view the values for each year. Select a cause in the legend to show or hide it. The shaded period marks 2011–2015, when changes in satellite detection methods may affect comparisons between earlier and later years.

Data source: Global Forest Watch / World Resources Institute (2026), tree-cover loss and drivers, 30% canopy density, 2001-2025.

2. Comparing tree-cover loss and forest-area change by country

Use the buttons to compare two measures. Tree-cover loss represents the share of each country’s 2000 tree cover recorded as lost by 2025 in the satellite dataset. Forest-area change shows the percentage difference between the country’s reported forest area in 2000 and 2025, based on FAO data. Because the measures are defined differently, their patterns are not expected to match exactly. Russia, Brazil, Canada, the United States and Indonesia together account for 59% of the recorded tree-cover loss in this dataset.

# Chart 2: world map with two layers (loss, forest-area change) switched by buttons
# Drop very small territories, which add noise and cannot be seen on a world map
mp <- allc %>% filter(extent_2000_ha > 1e5, y2000 > 100) %>%
  mutate(tip = paste0("<b>", country, "</b><br>Tree cover lost 2001-2025: ", round(loss_pct, 1), "% of 2000 cover (", round(total / 1e6, 1), " Mha)",
                      "<br>Forest area change 2000-2025: ", sprintf("%+.1f", net_pct), "% (", sprintf("%+.1f", net_mha), " Mha)",
                      "<br>Forest area in 2025: ", format(round(y2025 / 1000, 1), big.mark = ","), " Mha"))   # hover text

# Map appearance: natural-earth projection, light grey land
geo <- list(projection = list(type = "natural earth"), showframe = FALSE, showcoastlines = FALSE, showcountries = TRUE,
            countrycolor = "#d9d9d9", bgcolor = "rgba(0,0,0,0)", showland = TRUE, landcolor = "#f4f4f4")

plot_ly() %>%
  # Layer 1: tree-cover loss as % of the 2000 cover (values above 40% are shown as 40%)
  add_trace(type = "choropleth", locations = mp$iso3, z = pmin(mp$loss_pct, 40), text = mp$tip, hoverinfo = "text",
            name = "Tree-cover loss", colorscale = list(c(0, "#fff5eb"), c(0.5, "#fd8d3c"), c(1, "#7f2704")), zmin = 0, zmax = 40,
            marker = list(line = list(color = "white", width = 0.3)),
            colorbar = list(title = "% of 2000<br>tree cover lost<br>(40 = 40%+)", len = 0.6), visible = TRUE) %>%
  # Layer 2: net change in forest area, green = gain, red = loss (capped at +/-40%)
  add_trace(type = "choropleth", locations = mp$iso3, z = pmax(pmin(mp$net_pct, 40), -40), text = mp$tip, hoverinfo = "text",
            name = "Forest-area change", colorscale = list(c(0, "#b2182b"), c(0.5, "#f7f7f7"), c(1, "#1b7837")), zmin = -40, zmax = 40,
            marker = list(line = list(color = "white", width = 0.3)),
            colorbar = list(title = "% change in<br>forest area<br>(capped +/-40)", len = 0.6), visible = FALSE) %>%
  layout(title = "Tree-cover loss, 2001-2025 (satellites)", geo = geo, font = fnt, margin = list(t = 100, b = 10),
         # the two buttons show one layer and hide the other, and update the title
         updatemenus = list(list(type = "buttons", direction = "right", x = 0, y = 1.02, xanchor = "left", yanchor = "bottom",
           buttons = list(
             list(method = "update", label = "Tree-cover loss", args = list(list(visible = c(TRUE, FALSE)), list(title = "Tree-cover loss, 2001-2025 (satellites)"))),
             list(method = "update", label = "Forest-area change", args = list(list(visible = c(FALSE, TRUE)), list(title = "Net change in forest area, 2000-2025 (FAO)")))))))

What the chart shows: Two country-level views of forest change. The orange scale represents tree-cover loss as a share of the 2000 baseline, while the green-to-red scale represents reported net forest-area change. How to use the chart: Select a button to switch between the measures. Hover over a country to see its values and use the map controls to zoom. Countries shown in grey do not have matched records in both datasets.

Data sources: Global Forest Watch / World Resources Institute (2026), tree-cover loss 2001-2025 at 30% canopy density; Food and Agriculture Organization of the United Nations (2025), Global Forest Resources Assessment 2025, forest area in 2000 and 2025.

3. The main drivers differ between countries

The reported drivers of tree-cover loss vary across countries. Permanent agriculture represents 73% of Brazil’s loss and 72% of Indonesia’s loss. Wildfire accounts for 74% of recorded loss in Russia and 68% in Canada. In the United States, logging is the largest driver in this grouping, accounting for 62%. Australia also shows a strong change in the years associated with the Black Summer bushfires: recorded loss reached 1.7 million hectares in 2019 and 2.4 million hectares in 2020, compared with a typical value of around 0.2 million hectares.

# Chart 3: yearly loss by cause for one country at a time, chosen from a dropdown
ctr3 <- unique(c("Australia", top15$country))   # Australia first, then the 15 countries with most loss
np   <- length(pal)                             # number of causes (one bar trace each)

# Fill years/causes with no recorded loss as zero, so every country has every trace
by3 <- by_cy %>% filter(country %in% ctr3) %>%
  complete(country = ctr3, year = 2001:2025, group = names(pal), fill = list(ha = 0))

# One set of bar traces per country; only the first country (Australia) is visible at the start
fig3 <- plot_ly()
for (i in seq_along(ctr3)) {
  for (g in names(pal)) {
    d <- by3 %>% filter(country == ctr3[i], group == g)
    fig3 <- fig3 %>% add_bars(x = d$year, y = d$ha, name = g, legendgroup = g, visible = (i == 1),
                              marker = list(color = pal[[g]]),
                              hovertemplate = paste0(g, ": %{y:,.0f} ha<extra>%{x}</extra>"))
  }
}

# Dropdown entries: each shows the traces of one country and updates the title
btn3 <- lapply(seq_along(ctr3), function(k) {
  vis <- rep(FALSE, length(ctr3) * np); vis[((k - 1) * np + 1):(k * np)] <- TRUE
  list(method = "update", label = ctr3[k],
       args = list(list(visible = vis), list(title = paste0("Tree-cover loss by cause: ", ctr3[k]))))
})

fig3 %>% layout(barmode = "stack", title = "Tree-cover loss by cause: Australia", font = fnt,
  xaxis = list(title = ""), yaxis = list(title = "Hectares per year"),
  legend = list(orientation = "h", y = -0.15),
  margin = list(t = 100),
  updatemenus = list(list(type = "dropdown", x = 0, y = 1.02, xanchor = "left", yanchor = "bottom", buttons = btn3)))

What the chart shows: Annual tree-cover loss from 2001 to 2025 for one selected country, separated by driver. The patterns can be compared across countries. How to use the chart: Choose a country from the dropdown list. Hover over a bar to see the area recorded for that year, or select a driver in the legend to hide or display it.

Data source: Global Forest Watch / World Resources Institute (2026), tree-cover loss and drivers, 30% canopy density, 2001-2025.

4. Comparing the reported causes of loss

Some drivers, such as conversion to agriculture or infrastructure, may result in a long-term change in land use. Other drivers, including fire, logging and shifting cultivation, may be followed by regrowth, although this is not guaranteed. The chart compares the share of loss attributed to each driver in the 15 countries with the largest recorded losses. Countries are ordered by the proportion assigned to permanent conversion. This grouping is only a broad guide: for example, fires can also cause lasting changes in some ecosystems.

# Chart 4: 100% stacked horizontal bars, share of each country's loss by cause
c4 <- by_cy %>% filter(country %in% top15$country) %>%
  group_by(country, group) %>% summarise(ha = sum(ha), .groups = "drop") %>%
  group_by(country) %>% mutate(share = ha / sum(ha) * 100, total = sum(ha)) %>% ungroup()

# Order the countries from least to most permanent conversion
ord4 <- top15 %>% arrange(perm_share) %>% pull(country)

fig4 <- plot_ly()
for (g in names(pal)) {
  d <- c4 %>% filter(group == g) %>% mutate(country = factor(country, levels = ord4)) %>% arrange(country)
  fig4 <- fig4 %>% add_bars(x = d$share, y = d$country, orientation = "h", name = g, marker = list(color = pal[[g]]),
                            customdata = d$total / 1e6,    # country's total loss, shown on hover
                            hovertemplate = paste0("%{y}<br>", g, ": %{x:.0f}%<br>Total loss: %{customdata:.1f} Mha<extra></extra>"))
}
fig4 %>% layout(barmode = "stack", title = "What caused each country's tree-cover loss, 2001-2025", font = fnt,
  xaxis = list(title = "Share of the country's loss (%)", range = c(0, 100)),
  yaxis = list(title = "", categoryorder = "array", categoryarray = ord4),
  legend = list(orientation = "h", y = -0.2))

What the chart shows: The percentage of recorded tree-cover loss attributed to each driver in the 15 countries with the highest totals. The colours separate the driver groups, but they should not be interpreted as a guarantee that an area will or will not regrow. How to use the chart: Hover over a segment to see its percentage and the country’s total loss. Select a driver in the legend to hide or display that category.

Data source: Global Forest Watch / World Resources Institute (2026), tree-cover loss and drivers, 30% canopy density, 2001-2025.

5. Comparing gross tree-cover loss with net forest-area change

This chart compares the satellite-based loss measure with FAO’s reported change in forest area. Each bubble represents a country with at least one million hectares in the relevant baseline measures (105 countries). Moving to the right indicates a larger share of 2000 tree cover lost between 2001 and 2025. Moving upwards indicates an increase in reported forest area between 2000 and 2025, including the effects of regrowth and planting. Among the 61 countries that lost more than 10% of their baseline tree cover, 29 reported forest area in 2025 that was at least as large as in 2000.

# Chart 5: bubble chart, tree-cover loss (x) against net forest-area change (y)

# Main cause of loss for each country (the cause with the most loss), used for the colour
dom <- by_cy %>% group_by(country, group) %>% summarise(ha = sum(ha), .groups = "drop") %>%
  group_by(country) %>% slice_max(ha, n = 1, with_ties = FALSE) %>% ungroup() %>% select(country, dominant = group)

# Join the main cause to the comparison table and build the hover text
sc <- cmp %>% left_join(dom, by = "country") %>%
  mutate(tip = paste0("<b>", country, "</b><br>Lost ", round(loss_pct, 1), "% of its 2000 tree cover (", round(total / 1e6, 1), " Mha)",
                      "<br>Forest area change 2000-2025: ", sprintf("%+.1f", net_pct), "% (", sprintf("%+.1f", net_mha), " Mha)",
                      "<br>Permanent conversion: ", round(perm_share), "% of loss"))

# Labels for the largest countries, with hand-set offsets (ax = pixels sideways, ay = pixels up/down)
# so that the labels do not overlap each other
off <- list(Russia = c(-70, -30), Canada = c(-45, -78), `United States` = c(5, -100), Indonesia = c(80, -62),
            Australia = c(60, 40), Brazil = c(-5, 45), `Democratic Republic of the Congo` = c(-70, 12), China = c(-45, -25))
lab <- sc %>% filter(country %in% names(off)) %>%
  mutate(label = ifelse(country == "Democratic Republic of the Congo", "DR Congo", country),
         ax = sapply(country, function(k) off[[k]][1]), ay = sapply(country, function(k) off[[k]][2]))

plot_ly(sc, x = ~loss_pct, y = ~net_pct, size = ~total, color = ~dominant, colors = pal, text = ~tip, hoverinfo = "text",
        type = "scatter", mode = "markers", sizes = c(8, 60),
        marker = list(opacity = 0.75, line = list(width = 0.5, color = "white"))) %>%
  layout(title = "Tree-cover loss against net change in forest area, 2000-2025", font = fnt,
         # zeroline and axis line are switched off so that no extra line crosses the chart
         xaxis = list(title = "Tree-cover loss 2001-2025 (% of 2000 tree cover, satellites)", zeroline = FALSE, showline = FALSE),
         yaxis = list(title = "Net change in forest area 2000-2025 (%, FAO)", zeroline = FALSE, showline = FALSE),
         legend = list(title = list(text = "Main cause of loss")),
         # dashed line at 0% = no net change in forest area
         shapes = list(list(type = "line", xref = "paper", x0 = 0, x1 = 1, y0 = 0, y1 = 0,
                            line = list(color = "#555", dash = "dash", width = 1))),
         annotations = c(
           # two short explanations of the dashed line, placed in the empty right-hand corners
           list(list(x = 0.99, y = 0.99, xref = "paper", yref = "paper", xanchor = "right", yanchor = "top",
                     text = "Above the dashed line: forest area increased", showarrow = FALSE, font = list(size = 11, color = "#555")),
                list(x = 0.99, y = 0.01, xref = "paper", yref = "paper", xanchor = "right", yanchor = "bottom",
                     text = "Below the dashed line: forest area decreased", showarrow = FALSE, font = list(size = 11, color = "#555"))),
           # country labels with thin leader lines
           lapply(seq_len(nrow(lab)), function(i)
             list(x = lab$loss_pct[i], y = lab$net_pct[i], text = lab$label[i], showarrow = TRUE, ax = lab$ax[i], ay = lab$ay[i],
                  arrowwidth = 0.6, arrowcolor = "#888", arrowhead = 0, font = list(size = 11, color = "#333")))))

What the chart shows: Each bubble represents a country. Its horizontal position shows tree-cover loss as a percentage of the 2000 baseline, and its vertical position shows the reported percentage change in forest area. Bubble size represents the total area of tree cover lost, while colour indicates the largest driver recorded for that country. How to use the chart: Hover over a bubble to view the country’s figures. Points above the dashed line indicate an increase in reported forest area; points below it indicate a decrease.

Data sources: Global Forest Watch / World Resources Institute (2026), tree-cover loss 2001-2025 at 30% canopy density; Food and Agriculture Organization of the United Nations (2025), Global Forest Resources Assessment 2025, forest area in 2000 and 2025.

Conclusion

The comparison shows that a high level of tree-cover loss does not always correspond to a decline in reported forest area. Russia and Canada recorded 91.8 million and 68.7 million hectares of tree-cover loss, respectively, with wildfire accounting for 74% of Russia’s loss and 68% of Canada’s. FAO data show a small increase in forest area in both countries between 2000 and 2025 (+2.5% and +2.4%). Brazil recorded 76.0 million hectares of tree-cover loss, of which 73% was attributed to permanent agriculture. Its reported forest area decreased by 13.3%, equivalent to about 75 million hectares.

Across the dataset, around 34% of tree-cover loss was assigned to permanent conversion associated with agriculture, mining and settlements. The average annual area of wildfire-related loss increased from 4.3 million hectares in 2001–2005 to 10.6 million hectares in 2021–2025.

Overall, the term “tree-cover loss” includes several different processes. The amount of loss is important, but the driver also affects how the change should be interpreted. These results show an association between two measures rather than proof that one causes the other, because the datasets record different aspects of forest change.

Limitations

References

Food and Agriculture Organization of the United Nations. (2025). Global Forest Resources Assessment 2025: Forest extent, characteristics and changes. https://fra-data.fao.org/

Global Forest Watch & World Resources Institute. (2026). Tree cover loss, tree cover loss by dominant driver and forest carbon data by country (Version v20260427). https://www.globalforestwatch.org/dashboards/global/

Hansen, M. C., Potapov, P. V., Moore, R., Hancher, M., Turubanova, S. A., Tyukavina, A., Thau, D., Stehman, S. V., Goetz, S. J., Loveland, T. R., Kommareddy, A., Egorov, A., Chini, L., Justice, C. O., & Townshend, J. R. G. (2013). High-resolution global maps of 21st-century forest cover change. Science, 342(6160), 850-853. https://doi.org/10.1126/science.1244693

Sims, M., Stanimirova, R., Raichuk, A., Neumann, M., et al. (2025). Global drivers of forest loss at 1 km resolution. Environmental Research Letters, 20(7), 074027. https://doi.org/10.1088/1748-9326/add606

Acknowledgements