19 Global Change
Much of the data over time about climate change has a scale problem. Things are pretty stable for quite a long period of time, and then there is a huge jump in the rate of change over the past 100 years. This makes things hard to plot. So today I thought I’d explore the ggforce
, specifically the facet_zoom()
function for zooming in on a particular part of a plot.
19.1 Data
The data come from a paper by Matt Osman and colleagues. The data for their Figure 2 are freely available, but there are two datasets side-by-side on one sheet, so extracting them took a few steps.
The first dataset is global mean surface temperatures (GMST) from 24K years ago to present, in 200-year bins. The second dataset is GMST from 1000 years ago to 50 years in the future, in 10-year bins. They have some overlap, so I’ll get rid of the years -1000 to present in the more coarse dataset.
Age BP \ Percentile: | 5th | 10th | 20th | 30th | 40th | 50th | 60th | 70th | 80th | 90th | 95th |
---|---|---|---|---|---|---|---|---|---|---|---|
-50--40 | 0.300 | 0.357 | 0.430 | 0.469 | 0.499 | 0.535 | 0.568 | 0.598 | 0.633 | 0.670 | 0.698 |
-40--30 | 0.145 | 0.193 | 0.252 | 0.288 | 0.321 | 0.348 | 0.377 | 0.404 | 0.430 | 0.467 | 0.496 |
-30--20 | -0.013 | 0.032 | 0.095 | 0.127 | 0.158 | 0.186 | 0.212 | 0.240 | 0.265 | 0.300 | 0.329 |
-20--10 | -0.061 | -0.014 | 0.047 | 0.080 | 0.114 | 0.138 | 0.164 | 0.189 | 0.218 | 0.252 | 0.280 |
-10-0 | -0.009 | 0.046 | 0.101 | 0.140 | 0.173 | 0.200 | 0.225 | 0.251 | 0.277 | 0.310 | 0.338 |
0-10 | -0.049 | 0.000 | 0.059 | 0.096 | 0.130 | 0.156 | 0.179 | 0.204 | 0.230 | 0.266 | 0.292 |
Cleaning this is tricky. I want to separate on the “-”, but not if it’s the “- for a negative number (who chose this format?!). I get to use a regex lookbehind, which I just learned about!”(?<=0)-” means a dash that is preceded by (but not including) a 0.
19.2 Initial Plot
As always, the first plot leaves a bit to be desired. Mainly because I forgot to convert the type of the start
and end
columns when I split them. It’s a quick fix with type_convert()
. I also subtracted the start column from 2020 to calculate the year of each estimate, rather than “years before present”.
19.3 Ribbons
Code
ggplot(dat, aes(x = year, y = `50th`)) +
geom_ribbon(aes(ymin = `5th`, ymax = `95th`),
fill = col[1]) +
geom_ribbon(aes(ymin = `10th`, ymax = `90th`),
fill = col[2]) +
geom_ribbon(aes(ymin = `20th`, ymax = `80th`),
fill = col[3]) +
geom_ribbon(aes(ymin = `30th`, ymax = `70th`),
fill = col[4]) +
geom_ribbon(aes(ymin = `40th`, ymax = `60th`),
fill = col[5]) +
geom_line(color = col[6])
19.4 Facet Zoom
Now I’ll use facet_zoom()
from ggforce to highlight the years since 1990. I do wish I could figure out how to specify the two x-axes separately. I’d like the top one to label every 2000 years, and the bottom one every 20.
Code
ggplot(dat, aes(x = year, y = `50th`)) +
geom_ribbon(aes(ymin = `5th`, ymax = `95th`, fill = col[1])) +
geom_ribbon(aes(ymin = `10th`, ymax = `90th`, fill = col[2])) +
geom_ribbon(aes(ymin = `20th`, ymax = `80th`, fill = col[3])) +
geom_ribbon(aes(ymin = `30th`, ymax = `70th`, fill = col[4])) +
geom_ribbon(aes(ymin = `40th`, ymax = `60th`, fill = col[5])) +
geom_ribbon(aes(ymin = `50th`, ymax = `50th`, fill = col[6]), alpha = 0) +
geom_line(color = col[6], size = 1) +
scale_fill_identity(name = "Percentile",
breaks = unclass(col[1:6]),
labels = c("5-95%", "10-90%", "20-80%", "30-70%", "40-60%", "50%"),
guide = "legend") +
#scale_x_continuous(breaks = seq(-24000, 2000, 2000)) +
facet_zoom(xlim = c(1900, 2070),
ylim = c(-0.5, 0.75),
horizontal = FALSE,
zoom.size = 1) +
labs(x = NULL, y = "Global mean surface temperature (GMST)\n") +
theme(legend.position = c(.81, .74),
legend.background = element_blank())