

{"id":3236,"date":"2015-01-18T09:50:05","date_gmt":"2015-01-18T14:50:05","guid":{"rendered":"http:\/\/rud.is\/b\/?p=3236"},"modified":"2018-03-07T16:44:05","modified_gmt":"2018-03-07T21:44:05","slug":"nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/","title":{"rendered":"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version)"},"content":{"rendered":"<p>D Kelly O\u2019Day did a [great post](https:\/\/chartsgraphs.wordpress.com\/2015\/01\/16\/nasa-gisss-annual-global-temperature-anomaly-trends\/) on charting NASA\u2019s Goddard Institute for Space Studies (GISS)  temperature anomaly data, but it sticks with base R for data munging &amp; plotting. While there&#8217;s absolutely nothing wrong with base R operations, I thought a modern take on the chart using `dplyr`, `magrittr` &amp; `tidyr` for data manipulation and `ggplot2` for formatting would be helpful for the scores of new folk learning R this year (our little language is becoming [all the rage](http:\/\/redmonk.com\/sogrady\/2015\/01\/14\/language-rankings-1-15\/), it seems). I also really enjoy working with weather data.<\/p>\n<p>Before further exposition, here&#8217;s the result:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3237\" data-permalink=\"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/forwp\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?fit=800%2C550&amp;ssl=1\" data-orig-size=\"800,550\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"forwp\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?fit=510%2C350&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?resize=510%2C351&#038;ssl=1\" alt=\"forwp\" width=\"510\" height=\"351\" class=\"aligncenter size-full wp-image-3237\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?w=800&amp;ssl=1 800w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?resize=150%2C103&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?resize=300%2C206&amp;ssl=1 300w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?resize=530%2C364&amp;ssl=1 530w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/p>\n<p>I made liberal use of the &#8220;piping&#8221; idiom encouraged `magrittr`, `dplyr` and other new R packages, including the forward assignment operator `->` (which may put some folks off a bit). That also meant using `magrittr`&#8217;s aliases for `[` and `[[`, which are more readable in pipes.<\/p>\n<p>I don&#8217;t use `library(tidyr)` since `tidyr`&#8217;s `extract` conflicts with `magrittr`&#8217;s, but you&#8217;ll see a `tidyr::gather` in the code for wide-to-long data shaping.<\/p>\n<p>I chose to use the monthly temperature anomaly data as a base layer in the chart as a contrast to the monthly- and annual-anomaly means. I also marked the hottest annual- and annual-mean anomalies and framed the decades with vertical markers. <\/p>\n<p>There are no hardcoded years or decades anywhere in the `ggplot2` code, so this should be quite reusable as the data source gets updated.<\/p>\n<p>As I come back to the chart, I think there may be a bit too much &#8220;chart junk&#8221; on it, but you can tweak it to your own aesthetic preferences (if you do, drop a note in the comments with a link to your creation).<\/p>\n<p>The code is below and in [this gist](https:\/\/gist.github.com\/hrbrmstr\/07ba10fb4c3fe9c9f3a0).<\/p>\n<pre lang=\"rsplus\">library(httr)\r\nlibrary(magrittr)\r\nlibrary(dplyr)\r\nlibrary(ggplot2)\r\n\r\n# data retrieval ----------------------------------------------------------\r\n\r\n# the user agent string was necessary for me; YMMV\r\n\r\npg <- GET(\"http:\/\/data.giss.nasa.gov\/gistemp\/tabledata_v3\/GLB.Ts+dSST.txt\",\r\n          user_agent(\"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit\/537.75.14 (KHTML, like Gecko) Version\/7.0.3 Safari\/7046A194A\"))\r\n\r\n# extract monthly data ----------------------------------------------------\r\n\r\ncontent(pg, as=\"text\") %>%\r\n  strsplit(\"\\n\") %>%\r\n  extract2(1) %>%\r\n  grep(\"^[[:digit:]]\", ., value=TRUE) -> lines\r\n\r\n# extract column names ----------------------------------------------------\r\n\r\ncontent(pg, as=\"text\") %>%\r\n  strsplit(\"\\n\") %>%\r\n  extract2(1) %>%\r\n  extract(8) %>%\r\n  strsplit(\"\\ +\") %>%\r\n  extract2(1) -> lines_colnames\r\n\r\n# make data frame ---------------------------------------------------------\r\n\r\ndata <- read.table(text=lines, stringsAsFactors=FALSE)\r\ncolnames(data) <- lines_colnames\r\n\r\n# transform data frame ----------------------------------------------------\r\n\r\ndata %>%\r\n  tidyr::gather(month, value, Jan, Feb, Mar, Apr, May, Jun,\r\n                       Jul, Aug, Sep, Oct, Nov, Dec) %>%     # wide to long\r\n  mutate(value=value\/100) %>%                                # convert to degree Celcius change\r\n  select(year=Year, month, value) %>%                        # only need these fields\r\n  mutate(date=as.Date(sprintf(\"%d-%d-%d\", year, month, 1)),  # make proper dates\r\n         decade=year %\/% 10,                                 # calc decade\r\n         start=decade*10, end=decade*10+9) %>%               # calc decade start\/end\r\n  group_by(decade) %>%\r\n    mutate(decade_mean=mean(value)) %>%                      # calc decade mean\r\n  group_by(year) %>%\r\n    mutate(annum_mean=mean(value)) %>%                       # calc annual mean\r\n  ungroup -> data\r\n\r\n# start plot --------------------------------------------------------------\r\n\r\ngg <- ggplot()\r\n\r\n# decade vertical markers -------------------------------------------------\r\n\r\ngg <- gg + geom_vline(data=data %>% select(end),\r\n                      aes(xintercept=as.numeric(as.Date(sprintf(\"%d-12-31\", end)))),\r\n                          size=0.5, color=\"#4575b4\", linetype=\"dotted\", alpha=0.5)\r\n\r\n# monthly data ------------------------------------------------------------\r\n\r\ngg <- gg + geom_line(data=data, aes(x=date, y=value, color=\"monthly anomaly\"),\r\n                     size=0.35, alpha=0.25)\r\ngg <- gg + geom_point(data=data, aes(x=date, y=value, color\"monthly anomaly\"),\r\n                      size=0.75, alpha=0.5)\r\n\r\n# decade mean -------------------------------------------------------------\r\n\r\ngg <- gg + geom_segment(data=data %>% distinct(decade, decade_mean, start, end),\r\n                        aes(x=as.Date(sprintf(\"%d-01-01\", start)),\r\n                            xend=as.Date(sprintf(\"%d-12-31\", end)),\r\n                            y=decade_mean, yend=decade_mean,\r\n                            color=\"decade mean anomaly\"),\r\n                        linetype=\"dashed\")\r\n\r\n# annual data -------------------------------------------------------------\r\n\r\ngg <- gg + geom_line(data=data %>% distinct(year, annum_mean),\r\n                      aes(x=as.Date(sprintf(\"%d-06-15\", year)), y=annum_mean,\r\n                          color=\"annual mean anomaly\"),\r\n                      size=0.5)\r\ngg <- gg + geom_point(data=data %>% distinct(year, annum_mean),\r\n                      aes(x=as.Date(sprintf(\"%d-06-15\", year)), y=annum_mean,\r\n                          color=\"annual mean anomaly\"),\r\n                      size=2)\r\n\r\n# additional annotations --------------------------------------------------\r\n\r\n# max annual mean anomaly horizontal marker\/text\r\n\r\ngg <- gg + geom_hline(yintercept=max(data$annum_mean),  alpha=0.9,\r\n                      color=\"#d73027\", linetype=\"dashed\", size=0.25)\r\n\r\ngg <- gg + annotate(\"text\",\r\n                    x=as.Date(sprintf(\"%d-12-31\", mean(range(data$year)))),\r\n                    y=max(data$annum_mean),\r\n                    color=\"#d73027\", alpha=0.9,\r\n                    hjust=0.25, vjust=-1, size=3,\r\n                    label=sprintf(\"Max annual mean anomaly %2.1f\u00baC\", max(data$annum_mean)))\r\n\r\ngg <- gg + geom_hline(yintercept=max(data$value),  alpha=0.9,\r\n                      color=\"#7f7f7f\", linetype=\"dashed\", size=0.25)\r\n\r\n# max annual anomaly horizontal marker\/text\r\n\r\ngg <- gg + annotate(\"text\",\r\n                    x=as.Date(sprintf(\"%d-12-31\", mean(range(data$year)))),\r\n                    y=max(data$value),\r\n                    color=\"#7f7f7f\",  alpha=0.9,\r\n                    hjust=0.25, vjust=-1, size=3,\r\n                    label=sprintf(\"Max annual anomaly %2.1f\u00baC\", max(data$value)))\r\n\r\ngg <- gg + annotate(\"text\",\r\n                    x=as.Date(sprintf(\"%d-12-31\", range(data$year)[2])),\r\n                    y=min(data$value), size=3, hjust=1,\r\n                    label=\"Data: http:\/\/data.giss.nasa.gov\/gistemp\/tabledata_v3\/GLB.Ts+dSST.txt\")\r\n\r\n# set colors --------------------------------------------------------------\r\n\r\ngg <- gg + scale_color_manual(name=\"\", values=c(\"#d73027\", \"#4575b4\", \"#7f7f7f\"))\r\n\r\n# set x axis limits -------------------------------------------------------\r\n\r\ngg <- gg + scale_x_date(expand=c(0, 1),\r\n                        limits=c(as.Date(sprintf(\"%d-01-01\", range(data$year)[1])),\r\n                                 as.Date(sprintf(\"%d-12-31\", range(data$year)[2]))))\r\n\r\n# add labels --------------------------------------------------------------\r\n\r\ngg <- gg + labs(x=NULL, y=\"GLOBAL Temp Anomalies in 1.0\u00baC\",\r\n                title=sprintf(\"GISS Land and Sea Temperature Annual Anomaly Trend (%d to %d)\\n\",\r\n                              range(data$year)[1], range(data$year)[2]))\r\n\r\n# theme\/legend tweaks -----------------------------------------------------\r\n\r\ngg <- gg + theme_bw()\r\ngg <- gg + theme(panel.grid=element_blank())\r\ngg <- gg + theme(panel.border=element_blank())\r\ngg <- gg + theme(legend.position=c(0.9, 0.2))\r\ngg <- gg + theme(legend.key=element_blank())\r\ngg <- gg + theme(legend.background=element_blank())\r\ngg\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>D Kelly O\u2019Day did a [great post](https:\/\/chartsgraphs.wordpress.com\/2015\/01\/16\/nasa-gisss-annual-global-temperature-anomaly-trends\/) on charting NASA\u2019s Goddard Institute for Space Studies (GISS) temperature anomaly data, but it sticks with base R for data munging &amp; plotting. While there&#8217;s absolutely nothing wrong with base R operations, I thought a modern take on the chart using `dplyr`, `magrittr` &amp; `tidyr` for data manipulation [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[24,678,673,674,91,680],"tags":[810],"class_list":["post-3236","post","type-post","status-publish","format-standard","hentry","category-charts-graphs","category-data-visualization","category-datavis-2","category-dataviz","category-r","category-weather","tag-post"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version) - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version) - rud.is\" \/>\n<meta property=\"og:description\" content=\"D Kelly O\u2019Day did a [great post](https:\/\/chartsgraphs.wordpress.com\/2015\/01\/16\/nasa-gisss-annual-global-temperature-anomaly-trends\/) on charting NASA\u2019s Goddard Institute for Space Studies (GISS) temperature anomaly data, but it sticks with base R for data munging &amp; plotting. While there&#8217;s absolutely nothing wrong with base R operations, I thought a modern take on the chart using `dplyr`, `magrittr` &amp; `tidyr` for data manipulation [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2015-01-18T14:50:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-07T21:44:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\\\/ggplot version)\",\"datePublished\":\"2015-01-18T14:50:05+00:00\",\"dateModified\":\"2018-03-07T21:44:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/\"},\"wordCount\":325,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2015\\\/01\\\/forwp.png\",\"keywords\":[\"post\"],\"articleSection\":[\"Charts &amp; Graphs\",\"Data Visualization\",\"DataVis\",\"DataViz\",\"R\",\"Weather\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/\",\"name\":\"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\\\/ggplot version) - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2015\\\/01\\\/forwp.png\",\"datePublished\":\"2015-01-18T14:50:05+00:00\",\"dateModified\":\"2018-03-07T21:44:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2015\\\/01\\\/forwp.png?fit=800%2C550&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2015\\\/01\\\/forwp.png?fit=800%2C550&ssl=1\",\"width\":800,\"height\":550},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2015\\\/01\\\/18\\\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\\\/ggplot version)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rud.is\\\/b\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\\\/\\\/rud.is\"],\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/author\\\/hrbrmstr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version) - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/","og_locale":"en_US","og_type":"article","og_title":"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version) - rud.is","og_description":"D Kelly O\u2019Day did a [great post](https:\/\/chartsgraphs.wordpress.com\/2015\/01\/16\/nasa-gisss-annual-global-temperature-anomaly-trends\/) on charting NASA\u2019s Goddard Institute for Space Studies (GISS) temperature anomaly data, but it sticks with base R for data munging &amp; plotting. While there&#8217;s absolutely nothing wrong with base R operations, I thought a modern take on the chart using `dplyr`, `magrittr` &amp; `tidyr` for data manipulation [&hellip;]","og_url":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/","og_site_name":"rud.is","article_published_time":"2015-01-18T14:50:05+00:00","article_modified_time":"2018-03-07T21:44:05+00:00","og_image":[{"url":"https:\/\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png","type":"","width":"","height":""}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version)","datePublished":"2015-01-18T14:50:05+00:00","dateModified":"2018-03-07T21:44:05+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/"},"wordCount":325,"commentCount":1,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png","keywords":["post"],"articleSection":["Charts &amp; Graphs","Data Visualization","DataVis","DataViz","R","Weather"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/","url":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/","name":"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version) - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png","datePublished":"2015-01-18T14:50:05+00:00","dateModified":"2018-03-07T21:44:05+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#primaryimage","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?fit=800%2C550&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/01\/forwp.png?fit=800%2C550&ssl=1","width":800,"height":550},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2015\/01\/18\/nasa-gisss-annual-global-temperature-anomaly-trends-dplyrggplot-version\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"NASA GISS\u2019s Annual Global Temperature Anomaly Trends (dplyr\/ggplot version)"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23idr-Qc","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":4753,"url":"https:\/\/rud.is\/b\/2016\/12\/20\/sergeant-a-r-boot-camp-for-apache-drill\/","url_meta":{"origin":3236,"position":0},"title":"sergeant : An R Boot Camp for Apache Drill","author":"hrbrmstr","date":"2016-12-20","format":false,"excerpt":"I recently mentioned that I've been working on a development version of an Apache Drill R package called sergeant. Here's a lifted \"TLDR\" on Drill: Drill supports a variety of NoSQL databases and file systems, including HBase, MongoDB, MapR-DB, HDFS, MapR-FS, Amazon S3, Azure Blob Storage, Google Cloud Storage, Swift,\u2026","rel":"","context":"In &quot;Apache Drill&quot;","block_context":{"text":"Apache Drill","link":"https:\/\/rud.is\/b\/category\/apache-drill\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3127,"url":"https:\/\/rud.is\/b\/2014\/11\/26\/visualizing-historical-most-likely-first-snowfall-dates-for-u-s-regions\/","url_meta":{"origin":3236,"position":1},"title":"Visualizing Historical &#038; Most-likely First Snowfall Dates for U.S. Regions","author":"hrbrmstr","date":"2014-11-26","format":false,"excerpt":"UPDATE: You can now run this as a local Shiny app by entering shiny::runGist(\"95ec24c1b0cb433a76a5\", launch.browser=TRUE) at an R prompt (provided all the dependent libraries (below) are installed) or use it interactively over at Shiny Apps. The impending arrival of the first real snowfall of the year in my part of\u2026","rel":"","context":"In &quot;Charts &amp; Graphs&quot;","block_context":{"text":"Charts &amp; Graphs","link":"https:\/\/rud.is\/b\/category\/charts-graphs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":5131,"url":"https:\/\/rud.is\/b\/2017\/03\/10\/making-a-case-for-case_when\/","url_meta":{"origin":3236,"position":2},"title":"Making a Case for case_when","author":"hrbrmstr","date":"2017-03-10","format":false,"excerpt":"This is a brief (and likely obvious, for some folks) post on the dplyr::case_when() function. Part of my work-work is dealing with data from internet scans. When we're performing a deeper inspection of a particular internet protocol or service we try to capture as much system and service metadata as\u2026","rel":"","context":"In &quot;dplyr&quot;","block_context":{"text":"dplyr","link":"https:\/\/rud.is\/b\/category\/dplyr\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/03\/Cursor_and_RStudio.png?fit=1200%2C464&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/03\/Cursor_and_RStudio.png?fit=1200%2C464&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/03\/Cursor_and_RStudio.png?fit=1200%2C464&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/03\/Cursor_and_RStudio.png?fit=1200%2C464&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/03\/Cursor_and_RStudio.png?fit=1200%2C464&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3364,"url":"https:\/\/rud.is\/b\/2015\/03\/30\/3364\/","url_meta":{"origin":3236,"position":3},"title":"A look at airline crashes in R with googlesheets, dplyr &#038; ggplot2","author":"hrbrmstr","date":"2015-03-30","format":false,"excerpt":"Over on The DO Loop, @RickWicklin does a nice job [visualizing the causes of airline crashes](http:\/\/blogs.sas.com\/content\/iml\/2015\/03\/30\/visualizing-airline-crashes\/) in SAS using a mosaic plot. More often than not, I find mosaic plots can be a bit difficult to grok, but Rick's use was spot on and I believe it shows the data\u2026","rel":"","context":"In &quot;Charts &amp; Graphs&quot;","block_context":{"text":"Charts &amp; Graphs","link":"https:\/\/rud.is\/b\/category\/charts-graphs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3498,"url":"https:\/\/rud.is\/b\/2015\/07\/09\/faceted-world-population-by-income-choropleths-in-ggplot\/","url_meta":{"origin":3236,"position":4},"title":"Faceted &#8220;World Population by Income&#8221; Choropleths in ggplot","author":"hrbrmstr","date":"2015-07-09","format":false,"excerpt":"Poynter did a nice interactive piece on world population by income (i.e. \"How Many Live on How Much, and Where\"). I'm always on the lookout for optimized shapefiles and clean data (I'm teaching a data science certificate program starting this Fall) and the speed of the site load and the\u2026","rel":"","context":"In &quot;cartography&quot;","block_context":{"text":"cartography","link":"https:\/\/rud.is\/b\/category\/cartography\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3028,"url":"https:\/\/rud.is\/b\/2014\/09\/20\/chartingmapping-the-scottish-vote-with-r-rvestdplyrtidyrtopojsonggplot\/","url_meta":{"origin":3236,"position":5},"title":"Charting\/Mapping the Scottish Vote with R (an rvest\/dplyr\/tidyr\/TopoJSON\/ggplot tutorial)","author":"hrbrmstr","date":"2014-09-20","format":false,"excerpt":"The BBC did a pretty good job [live tracking the Scotland secession vote](http:\/\/www.bbc.com\/news\/events\/scotland-decides\/results), but I really didn't like the color scheme they chose and decided to use the final tally site as the basis for another tutorial using the tools from the Hadleyverse and taking advantage of the fact that\u2026","rel":"","context":"In &quot;Charts &amp; Graphs&quot;","block_context":{"text":"Charts &amp; Graphs","link":"https:\/\/rud.is\/b\/category\/charts-graphs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/3236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=3236"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/3236\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=3236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=3236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=3236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}