suppressPackageStartupMessages({
  library(tidyverse)
  library(scales)
  library(glue)
  library(lubridate)
  library(gganimate)
  library(gifski)
  library(png)
  library(DT)
})

1 Data

The data used in this report is taken from this link.

read_cru_hemi <- function(filename) {
  # read in whole file as table
  tab <- read.table(filename,fill=TRUE)
  nrows <- nrow(tab)
  # create frame
  hemi <- data.frame(
    year=tab[seq(1,nrows,2),1],
    annual=tab[seq(1,nrows,2),14],
    month=array(tab[seq(1,nrows,2),2:13]),
    cover=array(tab[seq(2,nrows,2),2:13])
  )
}

url_dat <- "https://crudata.uea.ac.uk/cru/data/temperature/HadCRUT4-gl.dat"
temp_dat <- read_cru_hemi(url_dat)
min_year <- 1850
max_year <-2019

mo <- month(seq(as.Date("2000/1/1"), as.Date("2000/12/1"), "months"), label = TRUE, abbr = TRUE) %>% as.character()

temp_monthly <- 
  temp_dat %>%
  select(-annual, -starts_with("cover")) %>%
  pivot_longer(cols = starts_with("month"), names_to = "month", values_to = "anomaly",names_prefix = "month.")%>% 
  mutate(month = as.numeric(month)) %>% 
  filter(between(year, min_year,max_year))
p<-
  temp_monthly %>% 
  ggplot(aes(x=month, y=anomaly, color=year, group=year))+
  geom_line(alpha = 0.6, size = 0.8)+
  scale_color_gradient(low="royalblue", high="yellow", limits=c(min_year, max_year), guide = NULL) +
  geom_hline(yintercept=1.5, color="red", lty=2, size = 1.5) +
  geom_hline(yintercept=2, color="red", lty=1, size = 2)+
  scale_x_continuous(breaks=1:12, labels = mo) +
  scale_y_continuous(labels=NULL, breaks=NULL)+
  #geom_label(data = temp_monthly, aes(x = 1, y = -1.5, label = year), color = "white",fill="grey20", label.size = 0) +
  annotate(x=1, y=1.5, geom="label", label="1.5C", fill="grey20", color = "red", label.size = 0, size = 5) +
  annotate(x=1, y=2, geom="label", label="2.0C", fill="grey20", color = "red", label.size=0, size = 5) +
  theme_minimal()+
  theme(plot.background = element_rect(fill = "grey20"),
        axis.text.x = element_text(color = "white", size = 14),
        title = element_text(color = "white", size = 14),
        panel.grid = element_blank()
          )+
  labs(x="", y="", title = "Global Temperatures Change: {frame_along}",caption = "Made in R by Alex L.")+
  coord_polar()+
  transition_reveal(year)

if (FALSE){
  animate(p,duration = 30,fps = 10)
  anim_save("climate.gif")  
}else{
  animate(p, duration = 30,fps = 10, renderer = ffmpeg_renderer(options = list(loglevel = 'quiet')))
}

NA
NA
NA
temp_monthly %>% 
  ggplot(aes(x=month, y=anomaly, color=year, group=year))+
  geom_line(alpha = 0.6, size = 0.8)+
  scale_color_gradient(low="royalblue", high="yellow", limits=c(min_year, max_year), guide = NULL) +
  geom_hline(yintercept=1.5, color="red", lty=2, size = 1.5) +
  geom_hline(yintercept=2, color="red", lty=1, size = 2)+
  scale_x_continuous(breaks=1:12, labels = mo) +
  scale_y_continuous(labels=NULL, breaks=NULL)+
  #geom_label(data = temp_monthly, aes(x = 1, y = -1.5, label = year), color = "white",fill="grey20", label.size = 0) +
  annotate(x=1, y=1.5, geom="label", label="1.5C", fill="grey20", color = "red", label.size = 0, size = 5) +
  annotate(x=1, y=2, geom="label", label="2.0C", fill="grey20", color = "red", label.size=0, size = 5) +
  theme_minimal()+
  theme(plot.background = element_rect(fill = "grey20"),
        axis.text.x = element_text(color = "white", size = 14),
        title = element_text(color = "white", size = 14),
        panel.grid = element_blank()
          )+
  labs(x="", y="", title = "Global Temperatures Change: {frame_along}",caption = "Made in R by Alex L.")

url_co2<- "ftp://aftp.cmdl.noaa.gov/products/trends/co2/co2_mm_gl.txt"
temp_monthly %>% 
  group_by(year) %>% 
  summarise(anomaly = mean(anomaly)) %>% 
  mutate(isPositive = anomaly > 0) %>% 
  ungroup() %>% 
  ggplot(aes(year, anomaly))+
  geom_col(aes(fill = isPositive), alpha = 0.6, width = 1)+
  scale_fill_manual(values = c("blue", "red"), guide = NULL)+
  theme_bw()+
  scale_x_continuous(breaks = pretty_breaks(10))+
  scale_y_continuous(breaks = pretty_breaks(10))+
  labs(x="", 
       y = "Temperature Change [deg C]", 
       title = glue("Global Temperatures Change ({min_year}-{max_year})"))

NA
LS0tCnRpdGxlOiAiR2xvYmFsIFRlbXBlcmF0dXJlcyIKYXV0aG9yOiAiQWxleCBMaWZzaGl0eiIKZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQsICVZICVIOiVNOiVTIiwgdHo9IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLHVzZXR6PVRSVUUpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGNlcnVsZWFuCiAgICB0b2M6IHllcwotLS0KCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQogIGxpYnJhcnkoc2NhbGVzKQogIGxpYnJhcnkoZ2x1ZSkKICBsaWJyYXJ5KGx1YnJpZGF0ZSkKICBsaWJyYXJ5KGdnYW5pbWF0ZSkKICBsaWJyYXJ5KGdpZnNraSkKICBsaWJyYXJ5KHBuZykKICBsaWJyYXJ5KERUKQp9KQpgYGAKCgoKIyBEYXRhCgpUaGUgZGF0YSB1c2VkIGluIHRoaXMgcmVwb3J0IGlzIHRha2VuIGZyb20gW3RoaXMgbGlua10oaHR0cHM6Ly9jcnVkYXRhLnVlYS5hYy51ay9jcnUvZGF0YS90ZW1wZXJhdHVyZS8pLgoKCmBgYHtyfQpyZWFkX2NydV9oZW1pIDwtIGZ1bmN0aW9uKGZpbGVuYW1lKSB7CiAgIyByZWFkIGluIHdob2xlIGZpbGUgYXMgdGFibGUKICB0YWIgPC0gcmVhZC50YWJsZShmaWxlbmFtZSxmaWxsPVRSVUUpCiAgbnJvd3MgPC0gbnJvdyh0YWIpCiAgIyBjcmVhdGUgZnJhbWUKICBoZW1pIDwtIGRhdGEuZnJhbWUoCiAgICB5ZWFyPXRhYltzZXEoMSxucm93cywyKSwxXSwKICAgIGFubnVhbD10YWJbc2VxKDEsbnJvd3MsMiksMTRdLAogICAgbW9udGg9YXJyYXkodGFiW3NlcSgxLG5yb3dzLDIpLDI6MTNdKSwKICAgIGNvdmVyPWFycmF5KHRhYltzZXEoMixucm93cywyKSwyOjEzXSkKICApCn0KCnVybF9kYXQgPC0gImh0dHBzOi8vY3J1ZGF0YS51ZWEuYWMudWsvY3J1L2RhdGEvdGVtcGVyYXR1cmUvSGFkQ1JVVDQtZ2wuZGF0Igp0ZW1wX2RhdCA8LSByZWFkX2NydV9oZW1pKHVybF9kYXQpCgpgYGAKCmBgYHtyfQptaW5feWVhciA8LSAxODUwCm1heF95ZWFyIDwtMjAxOQoKbW8gPC0gbW9udGgoc2VxKGFzLkRhdGUoIjIwMDAvMS8xIiksIGFzLkRhdGUoIjIwMDAvMTIvMSIpLCAibW9udGhzIiksIGxhYmVsID0gVFJVRSwgYWJiciA9IFRSVUUpICU+JSBhcy5jaGFyYWN0ZXIoKQoKdGVtcF9tb250aGx5IDwtIAogIHRlbXBfZGF0ICU+JQogIHNlbGVjdCgtYW5udWFsLCAtc3RhcnRzX3dpdGgoImNvdmVyIikpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gc3RhcnRzX3dpdGgoIm1vbnRoIiksIG5hbWVzX3RvID0gIm1vbnRoIiwgdmFsdWVzX3RvID0gImFub21hbHkiLG5hbWVzX3ByZWZpeCA9ICJtb250aC4iKSU+JSAKICBtdXRhdGUobW9udGggPSBhcy5udW1lcmljKG1vbnRoKSkgJT4lIAogIGZpbHRlcihiZXR3ZWVuKHllYXIsIG1pbl95ZWFyLG1heF95ZWFyKSkKCgpgYGAKCgpgYGB7cn0KcDwtCiAgdGVtcF9tb250aGx5ICU+JSAKICBnZ3Bsb3QoYWVzKHg9bW9udGgsIHk9YW5vbWFseSwgY29sb3I9eWVhciwgZ3JvdXA9eWVhcikpKwogIGdlb21fbGluZShhbHBoYSA9IDAuNiwgc2l6ZSA9IDAuOCkrCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93PSJyb3lhbGJsdWUiLCBoaWdoPSJ5ZWxsb3ciLCBsaW1pdHM9YyhtaW5feWVhciwgbWF4X3llYXIpLCBndWlkZSA9IE5VTEwpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MS41LCBjb2xvcj0icmVkIiwgbHR5PTIsIHNpemUgPSAxLjUpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MiwgY29sb3I9InJlZCIsIGx0eT0xLCBzaXplID0gMikrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0xOjEyLCBsYWJlbHMgPSBtbykgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9TlVMTCwgYnJlYWtzPU5VTEwpKwogICNnZW9tX2xhYmVsKGRhdGEgPSB0ZW1wX21vbnRobHksIGFlcyh4ID0gMSwgeSA9IC0xLjUsIGxhYmVsID0geWVhciksIGNvbG9yID0gIndoaXRlIixmaWxsPSJncmV5MjAiLCBsYWJlbC5zaXplID0gMCkgKwogIGFubm90YXRlKHg9MSwgeT0xLjUsIGdlb209ImxhYmVsIiwgbGFiZWw9IjEuNUMiLCBmaWxsPSJncmV5MjAiLCBjb2xvciA9ICJyZWQiLCBsYWJlbC5zaXplID0gMCwgc2l6ZSA9IDUpICsKICBhbm5vdGF0ZSh4PTEsIHk9MiwgZ2VvbT0ibGFiZWwiLCBsYWJlbD0iMi4wQyIsIGZpbGw9ImdyZXkyMCIsIGNvbG9yID0gInJlZCIsIGxhYmVsLnNpemU9MCwgc2l6ZSA9IDUpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTIwIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTQpLAogICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDE0KSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpCiAgICAgICAgICApKwogIGxhYnMoeD0iIiwgeT0iIiwgdGl0bGUgPSAiR2xvYmFsIFRlbXBlcmF0dXJlcyBDaGFuZ2U6IHtmcmFtZV9hbG9uZ30iLGNhcHRpb24gPSAiTWFkZSBpbiBSIGJ5IEFsZXggTC4iKSsKICBjb29yZF9wb2xhcigpKwogIHRyYW5zaXRpb25fcmV2ZWFsKHllYXIpCgppZiAoRkFMU0UpewogIGFuaW1hdGUocCxkdXJhdGlvbiA9IDMwLGZwcyA9IDEwKQogIGFuaW1fc2F2ZSgiY2xpbWF0ZS5naWYiKSAgCn1lbHNlewogIGFuaW1hdGUocCwgZHVyYXRpb24gPSAzMCxmcHMgPSAxMCwgcmVuZGVyZXIgPSBmZm1wZWdfcmVuZGVyZXIob3B0aW9ucyA9IGxpc3QobG9nbGV2ZWwgPSAncXVpZXQnKSkpCn0KCgoKYGBgCmBgYHtyfQp0ZW1wX21vbnRobHkgJT4lIAogIGdncGxvdChhZXMoeD1tb250aCwgeT1hbm9tYWx5LCBjb2xvcj15ZWFyLCBncm91cD15ZWFyKSkrCiAgZ2VvbV9saW5lKGFscGhhID0gMC42LCBzaXplID0gMC44KSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3c9InJveWFsYmx1ZSIsIGhpZ2g9InllbGxvdyIsIGxpbWl0cz1jKG1pbl95ZWFyLCBtYXhfeWVhciksIGd1aWRlID0gTlVMTCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0xLjUsIGNvbG9yPSJyZWQiLCBsdHk9Miwgc2l6ZSA9IDEuNSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0yLCBjb2xvcj0icmVkIiwgbHR5PTEsIHNpemUgPSAyKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTE6MTIsIGxhYmVscyA9IG1vKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1OVUxMLCBicmVha3M9TlVMTCkrCiAgI2dlb21fbGFiZWwoZGF0YSA9IHRlbXBfbW9udGhseSwgYWVzKHggPSAxLCB5ID0gLTEuNSwgbGFiZWwgPSB5ZWFyKSwgY29sb3IgPSAid2hpdGUiLGZpbGw9ImdyZXkyMCIsIGxhYmVsLnNpemUgPSAwKSArCiAgYW5ub3RhdGUoeD0xLCB5PTEuNSwgZ2VvbT0ibGFiZWwiLCBsYWJlbD0iMS41QyIsIGZpbGw9ImdyZXkyMCIsIGNvbG9yID0gInJlZCIsIGxhYmVsLnNpemUgPSAwLCBzaXplID0gNSkgKwogIGFubm90YXRlKHg9MSwgeT0yLCBnZW9tPSJsYWJlbCIsIGxhYmVsPSIyLjBDIiwgZmlsbD0iZ3JleTIwIiwgY29sb3IgPSAicmVkIiwgbGFiZWwuc2l6ZT0wLCBzaXplID0gNSkgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmV5MjAiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxNCksCiAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTQpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkKICAgICAgICAgICkrCiAgbGFicyh4PSIiLCB5PSIiLCB0aXRsZSA9ICJHbG9iYWwgVGVtcGVyYXR1cmVzIENoYW5nZToge2ZyYW1lX2Fsb25nfSIsY2FwdGlvbiA9ICJNYWRlIGluIFIgYnkgQWxleCBMLiIpCmBgYAoKYGBge3J9CnVybF9jbzI8LSAiZnRwOi8vYWZ0cC5jbWRsLm5vYWEuZ292L3Byb2R1Y3RzL3RyZW5kcy9jbzIvY28yX21tX2dsLnR4dCIKCmBgYAoKYGBge3J9CnRlbXBfbW9udGhseSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lIAogIHN1bW1hcmlzZShhbm9tYWx5ID0gbWVhbihhbm9tYWx5KSkgJT4lIAogIG11dGF0ZShpc1Bvc2l0aXZlID0gYW5vbWFseSA+IDApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBhbm9tYWx5KSkrCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBpc1Bvc2l0aXZlKSwgYWxwaGEgPSAwLjYsIHdpZHRoID0gMSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSwgZ3VpZGUgPSBOVUxMKSsKICB0aGVtZV9idygpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBwcmV0dHlfYnJlYWtzKDEwKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHByZXR0eV9icmVha3MoMTApKSsKICBsYWJzKHg9IiIsIAogICAgICAgeSA9ICJUZW1wZXJhdHVyZSBDaGFuZ2UgW2RlZyBDXSIsIAogICAgICAgdGl0bGUgPSBnbHVlKCJHbG9iYWwgVGVtcGVyYXR1cmVzIENoYW5nZSAoe21pbl95ZWFyfS17bWF4X3llYXJ9KSIpKQogIApgYGAKCg==