# Mauna Loa atmospheric CO2 change
# multi language plot for Wikipedia
# using different possible sources (Scripps if NOAA is not available)
#
# Used for https://commons.wikimedia.org/wiki/File:Mauna_Loa_CO2_monthly_mean_concentration.svg
# and related files in other languages. See all files in :
# https://commons.wikimedia.org/wiki/Template:Other_versions/Mauna_Loa_CO2_monthly_mean_concentration
#
# Update this script on :
# https://commons.wikimedia.org/w/index.php?title=Template:Other_versions/Mauna_Loa_CO2_monthly_mean_concentration.R&action=edit
# Required packages. used for :
library(readr) # reading data
library(dplyr) # data processing
library(ggplot2) # plot
library(gridExtra) # plot positionning
library(scales) # pretty breaks on plot axis
library(lubridate) # date processing
library(httr) # check url
library(Hmisc) # ci from bootstrap
# install all locales beforehand, e.g. :
# sudo locale-gen ca_ES.UTF-8
old_locale <- Sys.getlocale("LC_TIME")
# Translations ------------------------------------------------------------
language <- list(
ca_ES = list(
locale_lc_time = "ca_ES.UTF-8",
title = bquote("Mitjana mensual de la concentratió de"~CO[2]),
subtitle = "Mauna Loa",
caption_scripps = paste("dades : R. F. Keeling, S. J. Walker, S. C. Piper and A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Visitada", Sys.Date()),
caption_noaa = paste("dades : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) i\n Dr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Visitada ", Sys.Date()),
x = "any",
y = bquote("fracció de"~CO[2]~"en aire sec ("*mu*"mol/mol)"),
x2 = "mes",
y2 = bquote(atop("fracció de"~CO[2]~"en aire sec ("*mu*"mol/mol)",
"desviació de la mitjana anual")),
title2 = "Variació mensual"
),
cs_CZ = list(
locale_lc_time = "cs_CZ.UTF-8",
title = "Průměrné měsíční koncentrace oxidu uhličitého",
subtitle = "Mauna Loa",
caption_scripps = paste("data : R. F. Keeling, S. J. Walker, S. C. Piper a A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Přístupné", Sys.Date()),
caption_noaa = paste("data : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) a\nDr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Přístupné", Sys.Date()),
x = "rok",
y = bquote("koncentrace"~CO[2]~"v suchém vzduchu ("*mu*"mol/mol)"),
x2 = "měsíc",
y2 = bquote(atop("koncentrace"~CO[2]~"v suchém vzduchu ("*mu*"mol/mol)", "odchylka od ročního průměru")),
title2 = "Měsíční změna (průměrná roční odchylka)"
),
de_DE = list(
locale_lc_time = "de_DE.UTF-8",
title = bquote("Monatliche durchschnittliche"~CO[2]*"-Konzentration"),
subtitle = "Mauna Loa",
caption_scripps = paste("Datei : R. F. Keeling, S. J. Walker, S. C. Piper und A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Zugänglich am", Sys.Date()),
caption_noaa = paste("Datei : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) und\nDr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Zugänglich am", Sys.Date()),
x = "Jahr",
y = bquote(CO[2]*"-Anteil in trockener Luft ("*mu*"mol/mol)"),
x2 = "Monate",
y2 = bquote(atop(CO[2]*"-Anteil in trockener Luft ("*mu*"mol/mol)", "Abweichung vom Jahresmittel")),
title2 = "Monatliche Variation"
),
en_US = list(
locale_lc_time = "en_US.UTF-8",
title = bquote("Monthly mean"~CO[2]~"concentration"),
subtitle = "Mauna Loa",
caption_scripps = paste("Data : R. F. Keeling, S. J. Walker, S. C. Piper and A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Accessed", Sys.Date()),
caption_noaa = paste("Data : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) and\n Dr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Accessed ", Sys.Date()),
x = "Year",
y = bquote(CO[2]~"fraction in dry air ("*mu*"mol/mol)"),
x2 = "Month",
y2 = bquote(atop(CO[2]~"fraction in dry air ("*mu*"mol/mol)", "Departure from yearly average")),
title2 = "Seasonal variation"
),
es_ES = list(
locale_lc_time = "es_ES.UTF-8",
title = bquote("Media mensual de la concentración de"~CO[2]),
subtitle = "Mauna Loa",
caption_scripps = paste("dato : R. F. Keeling, S. J. Walker, S. C. Piper y A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Visitada", Sys.Date()),
caption_noaa = paste("dato : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) y\nDr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Visitada", Sys.Date()),
x = "Año",
y = bquote("Fraccion de"~CO[2]~"en aire secco ("*mu*"mol/mol)"),
x2 = "Mes",
y2 = bquote(atop("Fraccion de"~CO[2]~"en aire secco ("*mu*"mol/mol)", "Desviación de la media anual")),
title2 = "Variación mensual"
),
fr_FR = list(
locale_lc_time = "fr_FR.UTF-8",
title = bquote("Moyenne mensuelle de la concentration de"~CO[2]),
subtitle = "Mauna Loa",
caption_scripps = paste("données : R. F. Keeling, S. J. Walker, S. C. Piper et A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Accédé le", Sys.Date()),
caption_noaa = paste("données : Dr Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) et\n Dr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Accédé le", Sys.Date()),
x = "année",
y = bquote("fraction de"~CO[2]~"dans l'air sec ("*mu*"mol/mol)"),
x2 = "mois",
y2 = bquote(atop("fraction de"~CO[2]~"dans l'air sec ("*mu*"mol/mol)", "en écart à la moyenne annuelle")),
title2 = "Variation saisonnière"
),
nl_NL = list(
locale_lc_time = "nl_NL.UTF-8",
title = bquote("Maandelijkse gemiddelde"~CO[2]*"-concentratie"),
subtitle = "Mauna Loa",
caption_scripps = glue("Gegevens : R. F. Keeling, S. J. Walker, S. C. Piper en A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Geopend {Sys.Date()}"),
caption_noaa = glue("Gegevens : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) en\n Dr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Accessed {Sys.Date()}"),
x = "Jaar",
y = bquote(CO[2]*"-fractie in droge lucht ("*mu*"mol/mol)"),
x2 = "Mannd",
y2 = bquote(atop(CO[2]*"-fractie in droge lucht ("*mu*"mol/mol)", "Afwijking van jaargemiddelde")),
title2 = "Seizoensgebonden variatie"
),
nn_NO = list(
locale_lc_time = "nn_NO.UTF-8",
title = bquote("Gjennomsnittlig månedlig"~CO[2]*"-konsentrasjon"),
subtitle = "Mauna Loa",
caption_scripps = paste("data : R. F. Keeling, S. J. Walker, S. C. Piper og A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Vist", Sys.Date()),
caption_noaa = paste("data : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) og\nDr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Vist", Sys.Date()),
x = "År",
y = bquote(CO[2]*"-andel i tørr luft ("*mu*"mol/mol)"),
x2 = "Måned",
y2 = bquote(atop(CO[2]*"-andel i tørr luft ("*mu*"mol/mol)",
"Avvik fra årlig gjennomsnitt")),
title2 = "Årlig variasjon"
),
pl_PL = list(
locale_lc_time = "pl_PL.UTF-8",
title = bquote("Średnie miesięczne stężenie"~CO[2]),
subtitle = "Mauna Loa",
caption_scripps = paste("Dane : R. F. Keeling, S. J. Walker, S. C. Piper i A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Dostęp na", Sys.Date()),
caption_noaa = paste("Dane : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) i\nDr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Dostęp na", Sys.Date()),
x = "Rok",
y = bquote("Frakcja"~CO[2]~"w suchym powietrzu ("*mu*"mol/mol)"),
x2 = "Miesiąc",
y2 = bquote(atop("Frakcja"~CO[2]~"w suchym powietrzu ("*mu*"mol/mol)", "Odejście od średniej rocznej")),
title2 = "Wahania sezonowe"
),
ro_RO = list(
locale_lc_time = "ro_RO.UTF-8",
title = bquote("Concentrația medie lunară de"~CO[2]),
subtitle = "Mauna Loa, Hawaii",
caption_scripps = paste("Date: R. F. Keeling, S. J. Walker, S. C. Piper și A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). Accesat în", Sys.Date()),
caption_noaa = paste("Date : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) și\n Dr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). Accesat în", Sys.Date()),
x = "An",
y = bquote("Ponderea"~CO[2]~"în aer uscat ("*mu*"mol/mol)"),
x2 = "Lună",
y2 = bquote(atop("Abaterea cotei"~CO[2]~"în aer uscat ("*mu*"mol/mol)", "Abatere de la media anuală")),
title2 = "Variație sezonieră"
),
ru_RU = list(
locale_lc_time = "ru_RU.UTF-8",
title = bquote("Среднемесячная и среднегодовая концентрации"~CO[2]),
subtitle = "Мауна Лоа, Гаваи",
caption_scripps = paste("данные : R. F. Keeling, S. J. Walker, S. C. Piper и A. F. Bollenbacher\nScripps CO2 Program (https://scrippsco2.ucsd.edu/). доступ на", Sys.Date()),
caption_noaa = paste("данные : Dr. Pieter Tans, NOAA/ESRL (https://gml.noaa.gov/ccgg/trends/) и\nDr. Ralph Keeling, Scripps Institution of Oceanography (https://scrippsco2.ucsd.edu/). доступ на ", Sys.Date()),
x = "Годы",
y = bquote("Доля"~CO[2]~"в сухом воздухе ("*mu*"mol/mol)"),
x2 = "Месяцы",
y2 = bquote(atop("Отклонение доли"~CO[2]~"в сухом воздухе", "от среднегодового значения, мкмоль/моль")),
title2 = "Сезонные колебания"
)
)
# Data --------------------------------------------------------------------
# First try NOAA data, if not availble use Scripps data
if (!http_error("ftp://aftp.cmdl.noaa.gov/products/trends/co2/co2_mm_mlo.txt")) {
# https://gml.noaa.gov/ccgg/trends/data.html
source <- "noaa"
co2ml <- read_table(
"ftp://aftp.cmdl.noaa.gov/products/trends/co2/co2_mm_mlo.txt",
col_names = c("year", "month", "decimal", "average", "deseason", "ndays", "stddays", "unc"),
col_types = "iidddidd",
na = c("-99.99", "-1"),
comment = "#") %>%
group_by(year) %>%
mutate(year_mean = mean(average, na.rm = TRUE),
delta = average - year_mean,
vdate = ymd(paste0("2015-", month, "-01")))%>%
rename(co2 = average)
} else {
# https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record
# used during US gov shutdown
source <- "scripps"
co2ml <- read_csv(
"https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/monthly/monthly_in_situ_co2_mlo.csv",
col_names = c("year", "month", "xls_date", "decimal",
"co2_raw", "co2_raw_seas_adj", "fit", "fit_seas_adj",
"co2_filled", "co2_filled_seas_adj"),
col_types = "iiiddddddd",
skip = 57,
na = "-99.99",
comment = "\"") %>%
group_by(year) %>%
mutate(year_mean = mean(co2_filled, na.rm = TRUE),
delta = co2_filled - year_mean,
vdate = ymd(paste0("2015-", month, "-01"))) %>%
rename(co2 = co2_filled)
}
# Generate the plot for each language -------------------------------------
for (l in names(language)) {
message(l)
current <- language[[l]]
# format the date in local names
Sys.setlocale("LC_TIME", current$locale_lc_time)
# main plot
p1 <- ggplot(co2ml, aes(decimal, co2)) +
geom_line(color = "pink") +
geom_point(color = "red", size = 0.6) +
stat_smooth(span = 0.1) +
scale_x_continuous(breaks = pretty_breaks()) +
scale_y_continuous(breaks = pretty_breaks()) +
labs(x = current$x,
y = current$y,
title = current$title,
subtitle = paste(current$subtitle, min(co2ml$year), "-", max(co2ml$year)),
caption = paste(current[[paste0("caption_", source)]],
"https://w.wiki/4ZWn", sep = "\n")) +
theme_bw() +
theme(plot.caption = element_text(size = 7))
# inset plot
p2 <- ggplot(co2ml, aes(vdate, delta)) +
geom_hline(yintercept = 0) +
stat_smooth(span = 0.4, se = FALSE) +
stat_summary(fun.data = "mean_cl_boot", colour = "red", size = 0.3) +
scale_x_date(breaks = pretty_breaks(4),
minor_breaks = pretty_breaks(12),
labels = date_format("%b")) +
labs(x = current$x2,
y = current$y2,
title = current$title2) +
theme_bw()
# merge the plots and export in SVG
p1 + annotation_custom(grob = ggplotGrob(p2),
xmin = 1957, xmax = 1991, ymin = 361, ymax = 420)
ggsave(file = paste("co2_mauna_loa", l, Sys.Date(), "wp.svg", sep = "_"),
width = 20,
height = 20,
units = "cm",
device = svg)
}
# return to former locale
Sys.setlocale("LC_TIME", old_locale)