Course: Data Visualization

Programming Assignment 1: Visualize Data Using A Chart

Read data set.

temps <- read.csv("./data/GISTEMPData.csv"
                  , na.strings = c("***", "****"))

Extract year and monthly temperatures

# extract year and monthly temperatures
temps <- temps[, c(1:13)]
# reformat dataset by consolidating the individual month columns into a single "month" column
tempsDF.1 <- temps %>% 
  gather(month, avg_temp, c(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec))
# make the month column ordinal values
tempsDF.1$month <- as.factor(tempsDF.1$month)
levels(tempsDF.1$month) <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

Determine graph attributes.

start_year <- min(temps$Year)
end_year <- max(temps$Year)
interval <- (end_year - start_year) / 5
start_temp <- round(tempsDF.1 %>% 
                      filter(Year == start_year) %>% 
                      summarize(avg = mean(avg_temp, na.rm = TRUE))
                    , digits = 1)
package 㤼㸱bindrcpp㤼㸲 was built under R version 3.4.4
end_temp <- round(tempsDF.1 %>% 
                    filter(Year == end_year) %>% 
                    summarize(avg=mean(avg_temp, na.rm = TRUE))
                  , digits = 1)
avg_label <- paste0("Avg temperature was "
                   , start_temp
                   , "°C in "
                   , start_year
                   , " and "
                   , end_temp
                   , "°C in "
                   , end_year)
title <- "Average Global Temperatures"
source <- "Source: GISTEMP (Table Data: Global and Hemispheric Monthly Means and Zonal Annual Means)"
x_label <- "Year"
y_label <- "Average Temperature (°C)"

Create a graph using the monthly mean temperatures.

  • Each year will have about 12 points.
  • Quantile lines provided in yellow.
  • Smoothed conditional means line provided in red.
tempsDF.1 %>%
  ggplot(aes(x = Year, y = avg_temp)) +
      geom_point() +
      geom_smooth(colour = "red") + # https://ggplot2.tidyverse.org/reference/geom_smooth.html
      geom_quantile(colour = "yellow") + # https://ggplot2.tidyverse.org/reference/geom_quantile.html
      labs(title = title,
           subtitle = paste("Average monthly temperatures since", start_year),
           caption = source,
           y = y_label,
           x = x_label) + 
      scale_x_continuous(breaks=seq(start_year, end_year, 15)) +
      theme_economist() +
      scale_y_continuous(position = "right")

The trend lines help show an increase in temperature since 1880.

Let’s isolate the temperatures for a series of years. Doing so may give us a clearer picture of how temperatures change over time.

tempsDF.1 %>% 
  filter(Year %in% seq(start_year, end_year, interval)) %>%
  ggplot(aes(x = Year, y = avg_temp)) +
      geom_point(aes(color = factor(month))) + 
      geom_smooth(colour="#0072B2") + # https://ggplot2.tidyverse.org/reference/geom_smooth.html
      labs(title = title,
           subtitle = paste("Average monthly temperatures for selected years since", start_year),
           caption = source,
           y = y_label,
           x = x_label) +
      scale_x_continuous(breaks = seq(start_year, end_year, interval)) +
      theme_economist() +
      scale_y_continuous(position = "right") +
      geom_text(aes(label=paste0(month, ' [', avg_temp, ']')), hjust=-0.15, vjust=0.25, size=3.5) + 
      theme(legend.position = "bottom") +
      guides(color=guide_legend("Month")) +
      annotate("text", x = 1977, y = -55, size = 5, color = "blue", label = avg_label)

By showing data for only a few years results in a simplier and cleaner graph. Even though there is some overlap of temperatures, you can still see the range of temperatures for a given year. The data shows an increase in temperature.

Notice that there are under 12 recorded temperatures for 2015. As one of Tufte’s design rules, we show missing or incomplete data as to not bias the visualization.

Questions

  1. What are your x- and y-axes?

    • x-axis: year
    • y-axis: average temperature in °C
  2. Did you use a subset of the data? If so, what was it?

    I used a subset of the monthly means data. The file contained the following columns: Year, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, J-D, D-N, DJF, MAM, JJA, and SON. I chose all columns except J-D, D-N, DJF, MAM, JJA, and SON. I excluded the J-D column which represented the monthly average and chose to calculate it from the raw monthly data.

  3. Are there any particular aspects of your visualization to which you would like to bring attention?

    A scatterplot of the monthly temperatures is more informative than just plotting the monthly average. The various points show the range of temperatures. The smoothing lines show an upward trend.

    The second variation was an after thought. I thought that showing selected years with their monthly temperatures would be more informative than just a series of dots.

  4. What do you think the data and your visualization shows?

    Contrary to the opinions of many powerful US government officials, our planet is getting warmer.


Report generated: 2018-07-14 22:22:49
LS0tDQp0aXRsZTogIkdsb2JhbCBXYXJtaW5nIg0KYXV0aG9yOiBKb2huIFNpbnVlcw0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIENvdXJzZTogIERhdGEgVmlzdWFsaXphdGlvbg0KPiBQcm9ncmFtbWluZyBBc3NpZ25tZW50IDE6ICBWaXN1YWxpemUgRGF0YSBVc2luZyBBIENoYXJ0DQoNCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0aW9ucyhzY2lwZW49MTAwMDApICMgcmVtb3ZlIHNjaWVudGlmaWMgbm90YXRpb24gZnJvbSBncmFwaHMNCm9wdGlvbnMoZGlnaXRzPTIpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3RoZW1lcykNCg0Kc2V0LnNlZWQoMjAxKQ0Kcm0obGlzdCA9IGxzKCkpDQoNCmBgYA0KDQoNCiMjIyMgUmVhZCBkYXRhIHNldC4NCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1UUlVFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2hpZGUnfQ0KdGVtcHMgPC0gcmVhZC5jc3YoIi4vZGF0YS9HSVNURU1QRGF0YS5jc3YiDQogICAgICAgICAgICAgICAgICAsIG5hLnN0cmluZ3MgPSBjKCIqKioiLCAiKioqKiIpKQ0KYGBgDQoNCg0KIyMjIyBFeHRyYWN0IHllYXIgYW5kIG1vbnRobHkgdGVtcGVyYXR1cmVzDQpgYGB7ciwgZWNobz1UUlVFLCByZXN1bHRzPSdoaWRlJ30NCiMgZXh0cmFjdCB5ZWFyIGFuZCBtb250aGx5IHRlbXBlcmF0dXJlcw0KdGVtcHMgPC0gdGVtcHNbLCBjKDE6MTMpXQ0KDQojIHJlZm9ybWF0IGRhdGFzZXQgYnkgY29uc29saWRhdGluZyB0aGUgaW5kaXZpZHVhbCBtb250aCBjb2x1bW5zIGludG8gYSBzaW5nbGUgIm1vbnRoIiBjb2x1bW4NCnRlbXBzREYuMSA8LSB0ZW1wcyAlPiUgDQogIGdhdGhlcihtb250aCwgYXZnX3RlbXAsIGMoSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMpKQ0KDQojIG1ha2UgdGhlIG1vbnRoIGNvbHVtbiBvcmRpbmFsIHZhbHVlcw0KdGVtcHNERi4xJG1vbnRoIDwtIGFzLmZhY3Rvcih0ZW1wc0RGLjEkbW9udGgpDQpsZXZlbHModGVtcHNERi4xJG1vbnRoKSA8LSBjKCJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIpDQoNCmBgYA0KDQojIyMjIERldGVybWluZSBncmFwaCBhdHRyaWJ1dGVzLg0KYGBge3J9DQpzdGFydF95ZWFyIDwtIG1pbih0ZW1wcyRZZWFyKQ0KZW5kX3llYXIgPC0gbWF4KHRlbXBzJFllYXIpDQoNCmludGVydmFsIDwtIChlbmRfeWVhciAtIHN0YXJ0X3llYXIpIC8gNQ0KDQpzdGFydF90ZW1wIDwtIHJvdW5kKHRlbXBzREYuMSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFllYXIgPT0gc3RhcnRfeWVhcikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZShhdmcgPSBtZWFuKGF2Z190ZW1wLCBuYS5ybSA9IFRSVUUpKQ0KICAgICAgICAgICAgICAgICAgICAsIGRpZ2l0cyA9IDEpDQplbmRfdGVtcCA8LSByb3VuZCh0ZW1wc0RGLjEgJT4lIA0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoWWVhciA9PSBlbmRfeWVhcikgJT4lIA0KICAgICAgICAgICAgICAgICAgICBzdW1tYXJpemUoYXZnPW1lYW4oYXZnX3RlbXAsIG5hLnJtID0gVFJVRSkpDQogICAgICAgICAgICAgICAgICAsIGRpZ2l0cyA9IDEpDQphdmdfbGFiZWwgPC0gcGFzdGUwKCJBdmcgdGVtcGVyYXR1cmUgd2FzICINCiAgICAgICAgICAgICAgICAgICAsIHN0YXJ0X3RlbXANCiAgICAgICAgICAgICAgICAgICAsICLCsEMgaW4gIg0KICAgICAgICAgICAgICAgICAgICwgc3RhcnRfeWVhcg0KICAgICAgICAgICAgICAgICAgICwgIiBhbmQgIg0KICAgICAgICAgICAgICAgICAgICwgZW5kX3RlbXANCiAgICAgICAgICAgICAgICAgICAsICLCsEMgaW4gIg0KICAgICAgICAgICAgICAgICAgICwgZW5kX3llYXIpDQoNCnRpdGxlIDwtICJBdmVyYWdlIEdsb2JhbCBUZW1wZXJhdHVyZXMiDQpzb3VyY2UgPC0gIlNvdXJjZTogR0lTVEVNUCAoVGFibGUgRGF0YTogR2xvYmFsIGFuZCBIZW1pc3BoZXJpYyBNb250aGx5IE1lYW5zIGFuZCBab25hbCBBbm51YWwgTWVhbnMpIg0KeF9sYWJlbCA8LSAiWWVhciINCnlfbGFiZWwgPC0gIkF2ZXJhZ2UgVGVtcGVyYXR1cmUgKMKwQykiDQoNCmBgYA0KDQojIyMjIENyZWF0ZSBhIGdyYXBoIHVzaW5nIHRoZSBtb250aGx5IG1lYW4gdGVtcGVyYXR1cmVzLiAgDQoNCiogRWFjaCB5ZWFyIHdpbGwgaGF2ZSBhYm91dCAxMiBwb2ludHMuDQoqIFF1YW50aWxlIGxpbmVzIHByb3ZpZGVkIGluIHllbGxvdy4NCiogU21vb3RoZWQgY29uZGl0aW9uYWwgbWVhbnMgbGluZSBwcm92aWRlZCBpbiByZWQuDQoNCmBgYHtyLCByZXN1bHRzPVRSVUV9DQp0ZW1wc0RGLjEgJT4lDQogIGdncGxvdChhZXMoeCA9IFllYXIsIHkgPSBhdmdfdGVtcCkpICsNCiAgICAgIGdlb21fcG9pbnQoKSArDQogICAgICBnZW9tX3Ntb290aChjb2xvdXIgPSAicmVkIikgKyAjIGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZW9tX3Ntb290aC5odG1sDQogICAgICBnZW9tX3F1YW50aWxlKGNvbG91ciA9ICJ5ZWxsb3ciKSArICMgaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2dlb21fcXVhbnRpbGUuaHRtbA0KICAgICAgbGFicyh0aXRsZSA9IHRpdGxlLA0KICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJBdmVyYWdlIG1vbnRobHkgdGVtcGVyYXR1cmVzIHNpbmNlIiwgc3RhcnRfeWVhciksDQogICAgICAgICAgIGNhcHRpb24gPSBzb3VyY2UsDQogICAgICAgICAgIHkgPSB5X2xhYmVsLA0KICAgICAgICAgICB4ID0geF9sYWJlbCkgKyANCiAgICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKHN0YXJ0X3llYXIsIGVuZF95ZWFyLCAxNSkpICsNCiAgICAgIHRoZW1lX2Vjb25vbWlzdCgpICsNCiAgICAgIHNjYWxlX3lfY29udGludW91cyhwb3NpdGlvbiA9ICJyaWdodCIpDQoNCmBgYA0KDQpUaGUgdHJlbmQgbGluZXMgaGVscCBzaG93IGFuIGluY3JlYXNlIGluIHRlbXBlcmF0dXJlIHNpbmNlIGByIHN0YXJ0X3llYXJgLiAgDQoNCg0KTGV0J3MgaXNvbGF0ZSB0aGUgdGVtcGVyYXR1cmVzIGZvciBhIHNlcmllcyBvZiB5ZWFycy4gIERvaW5nIHNvIG1heSBnaXZlIHVzIGEgY2xlYXJlciBwaWN0dXJlIG9mIGhvdyB0ZW1wZXJhdHVyZXMgY2hhbmdlIG92ZXIgdGltZS4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMywgZmlnLmhlaWdodD0xNH0NCnRlbXBzREYuMSAlPiUgDQogIGZpbHRlcihZZWFyICVpbiUgc2VxKHN0YXJ0X3llYXIsIGVuZF95ZWFyLCBpbnRlcnZhbCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gYXZnX3RlbXApKSArDQogICAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGZhY3Rvcihtb250aCkpKSArIA0KICAgICAgZ2VvbV9zbW9vdGgoY29sb3VyPSIjMDA3MkIyIikgKyAjIGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZW9tX3Ntb290aC5odG1sDQogICAgICBsYWJzKHRpdGxlID0gdGl0bGUsDQogICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIkF2ZXJhZ2UgbW9udGhseSB0ZW1wZXJhdHVyZXMgZm9yIHNlbGVjdGVkIHllYXJzIHNpbmNlIiwgc3RhcnRfeWVhciksDQogICAgICAgICAgIGNhcHRpb24gPSBzb3VyY2UsDQogICAgICAgICAgIHkgPSB5X2xhYmVsLA0KICAgICAgICAgICB4ID0geF9sYWJlbCkgKw0KICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcShzdGFydF95ZWFyLCBlbmRfeWVhciwgaW50ZXJ2YWwpKSArDQogICAgICB0aGVtZV9lY29ub21pc3QoKSArDQogICAgICBzY2FsZV95X2NvbnRpbnVvdXMocG9zaXRpb24gPSAicmlnaHQiKSArDQogICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlMChtb250aCwgJyBbJywgYXZnX3RlbXAsICddJykpLCBoanVzdD0tMC4xNSwgdmp1c3Q9MC4yNSwgc2l6ZT0zLjUpICsgDQogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICAgICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCgiTW9udGgiKSkgKw0KICAgICAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk3NywgeSA9IC01NSwgc2l6ZSA9IDUsIGNvbG9yID0gImJsdWUiLCBsYWJlbCA9IGF2Z19sYWJlbCkNCg0KYGBgDQoNCkJ5IHNob3dpbmcgZGF0YSBmb3Igb25seSBhIGZldyB5ZWFycyByZXN1bHRzIGluIGEgc2ltcGxpZXIgYW5kIGNsZWFuZXIgZ3JhcGguICBFdmVuIHRob3VnaCB0aGVyZSBpcyBzb21lIG92ZXJsYXAgb2YgdGVtcGVyYXR1cmVzLCB5b3UgY2FuIHN0aWxsIHNlZSB0aGUgcmFuZ2Ugb2YgdGVtcGVyYXR1cmVzIGZvciBhIGdpdmVuIHllYXIuICBUaGUgZGF0YSBzaG93cyBhbiBpbmNyZWFzZSBpbiB0ZW1wZXJhdHVyZS4NCg0KTm90aWNlIHRoYXQgdGhlcmUgYXJlIHVuZGVyIDEyIHJlY29yZGVkIHRlbXBlcmF0dXJlcyBmb3IgMjAxNS4gIEFzIG9uZSBvZiBUdWZ0ZSdzIGRlc2lnbiBydWxlcywgd2Ugc2hvdyBtaXNzaW5nIG9yIGluY29tcGxldGUgZGF0YSBhcyB0byBub3QgYmlhcyB0aGUgdmlzdWFsaXphdGlvbi4NCg0KDQojIyMjIFF1ZXN0aW9ucyANCg0KMS4gIFdoYXQgYXJlIHlvdXIgeC0gYW5kIHktYXhlcz8NCg0KICAgICogeC1heGlzOiB5ZWFyDQogICAgKiB5LWF4aXM6IGF2ZXJhZ2UgdGVtcGVyYXR1cmUgaW4gwrBDDQoNCg0KMi4gIERpZCB5b3UgdXNlIGEgc3Vic2V0IG9mIHRoZSBkYXRhPyBJZiBzbywgd2hhdCB3YXMgaXQ/DQoNCiAgICBJIHVzZWQgYSBzdWJzZXQgb2YgdGhlIG1vbnRobHkgbWVhbnMgZGF0YS4gIFRoZSBmaWxlIGNvbnRhaW5lZCB0aGUgZm9sbG93aW5nIGNvbHVtbnM6ICBZZWFyLCBKYW4sIEZlYiwgTWFyLCBBcHIsIE1heSwgSnVuLCBKdWwsIEF1ZywgU2VwLCBPY3QsIE5vdiwgRGVjLCBKLUQsIEQtTiwgREpGLCBNQU0sIEpKQSwgYW5kIFNPTi4gIEkgY2hvc2UgYWxsIGNvbHVtbnMgZXhjZXB0IEotRCwgRC1OLCBESkYsIE1BTSwgSkpBLCBhbmQgU09OLiAgSSBleGNsdWRlZCB0aGUgSi1EIGNvbHVtbiB3aGljaCByZXByZXNlbnRlZCB0aGUgbW9udGhseSBhdmVyYWdlIGFuZCBjaG9zZSB0byBjYWxjdWxhdGUgaXQgZnJvbSB0aGUgcmF3IG1vbnRobHkgZGF0YS4NCg0KDQozLiAgQXJlIHRoZXJlIGFueSBwYXJ0aWN1bGFyIGFzcGVjdHMgb2YgeW91ciB2aXN1YWxpemF0aW9uIHRvIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGJyaW5nIGF0dGVudGlvbj8NCg0KICAgIEEgc2NhdHRlcnBsb3Qgb2YgdGhlIG1vbnRobHkgdGVtcGVyYXR1cmVzIGlzIG1vcmUgaW5mb3JtYXRpdmUgdGhhbiBqdXN0IHBsb3R0aW5nIHRoZSBtb250aGx5IGF2ZXJhZ2UuICBUaGUgdmFyaW91cyBwb2ludHMgc2hvdyB0aGUgcmFuZ2Ugb2YgdGVtcGVyYXR1cmVzLiAgVGhlIHNtb290aGluZyBsaW5lcyBzaG93IGFuIHVwd2FyZCB0cmVuZC4NCg0KICAgIFRoZSBzZWNvbmQgdmFyaWF0aW9uIHdhcyBhbiBhZnRlciB0aG91Z2h0LiAgSSB0aG91Z2h0IHRoYXQgc2hvd2luZyBzZWxlY3RlZCB5ZWFycyB3aXRoIHRoZWlyIG1vbnRobHkgdGVtcGVyYXR1cmVzIHdvdWxkIGJlIG1vcmUgaW5mb3JtYXRpdmUgdGhhbiBqdXN0IGEgc2VyaWVzIG9mIGRvdHMuDQoNCjQuICBXaGF0IGRvIHlvdSB0aGluayB0aGUgZGF0YSBhbmQgeW91ciB2aXN1YWxpemF0aW9uIHNob3dzPw0KDQogICAgQ29udHJhcnkgdG8gdGhlIG9waW5pb25zIG9mIG1hbnkgcG93ZXJmdWwgVVMgZ292ZXJubWVudCBvZmZpY2lhbHMsIG91ciBwbGFuZXQgaXMgZ2V0dGluZyB3YXJtZXIuDQoNCg0KKioqDQojIyMjIyMgUmVwb3J0IGdlbmVyYXRlZDogIGByIFN5cy50aW1lKClgDQo=