Economist-Style Plot using R

R Codes for Data Cleaning and Visualization

Above Economist-Style Plot can be created by using R as follows:

# Load some packages: 
library(tidyverse)
library(pwt9)
library(ggthemes)

# Load Penn World Table Data: 
data("pwt9.0")

# Prepare data for ploting: 

some_countries <- c("France", "Vietnam", "Japan", "Singapore", "United States", "South Korea")

pwt9.1 %>% 
  mutate(country = as.character(country)) %>% 
  mutate(country = case_when(country == "United States of America" ~ "United States", 
                             country == "Republic of Korea" ~ "South Korea", 
                             country == "Viet Nam" ~ "Vietnam", 
                             TRUE ~ country)) %>% 
  select(year, country, avh) %>% 
  na.omit() %>% 
  filter(year >= 1986) %>% 
  filter(country %in% some_countries) -> df_plot


# Make a draft graph: 

my_colors <-  c("#04536e", "#7c2817", "#f15c42", "#3d6a51", "#eca324", "#12a4dc")
my_font <- "Ubuntu Condensed"
label_y <- c(1986, rep("", 3), 1990, rep("", 3), 1994, rep("", 3), 1998, rep("", 3), 
             2002, rep("", 3), 2006, rep("", 3), 2010, rep("", 3), 2014, rep("", 2), 2017)


df_plot %>% 
  filter(year == 1988) %>% 
  filter(!country %in% c("Vietnam", "Singapore")) -> df_text1

df_plot %>% 
  filter(year == 1988) %>% 
  filter(country %in% c("Singapore")) -> df_sin 

df_plot %>% 
  filter(year == 1988) %>% 
  filter(country %in% c("Vietnam")) -> df_vie

df_plot %>% 
  ggplot(aes(year, avh, group = country, color = country)) + 
  geom_line(size = 1.5, show.legend = FALSE) + 
  theme_economist(base_family = my_font) + 
  scale_color_manual(values = my_colors) + 
  scale_x_continuous(limits = c(1986, 2017), breaks = seq(1986, 2017, 1), 
                     labels = label_y, expand = c(0, 0)) + 
  scale_y_continuous(limits = c(1450, 3000)) + 
  theme(panel.grid.minor = element_blank()) + 
  geom_text(data = df_text1, aes(year, avh + 50, label = country), size = 4.5, 
            hjust = 0, family = my_font, show.legend = FALSE) + 
  geom_text(data = df_sin, aes(year, avh + 110, label = country), size = 4.5, 
            hjust = 0, family = my_font, show.legend = FALSE) + 
  geom_text(data = df_vie, aes(year, avh - 40, label = country), size = 4.5, 
            hjust = 0, family = my_font, show.legend = FALSE) + 
  theme(plot.title = element_text(size = 22, color = "grey10")) + 
  theme(plot.subtitle = element_text(size = 14, color = "grey20")) + 
  theme(plot.caption = element_text(size = 12, color = "grey30", vjust = -3)) + 
  theme(plot.margin = unit(c(0.7, 1, 1, 1), "cm")) + 
  theme(axis.title = element_blank()) + 
  theme(axis.text = element_text(size = 13, color = "grey20")) + 
  theme(axis.text.x = element_text(size = 13, color = "grey20", vjust = 4)) + 
  theme(axis.ticks.length.x = unit(2, "mm")) + 
  labs(title = "Average annual hours worked by persons engaged", 
       subtitle = "Average annual hours worked is defined as the total number of hours actually worked\nper year divided by the average number of people in employment per year.", 
       caption = "Source: The Penn World Table (PWT)")


library(grid)
grid.rect(x = 0.015, y = 0.93, hjust = 1, vjust = 0, gp = gpar(fill = "#e5001c", lwd = 0))  
grid.rect(x = 1, y = 1 - 0.005, hjust = 1, vjust = 0,  gp = gpar(fill = "#e5001c", lwd = 0)) 
LS0tCnRpdGxlOiAiQXZlcmFnZSBhbm51YWwgaG91cnMgd29ya2VkIGJ5IHBlcnNvbnMgZW5nYWdlZCwgMjAxNyAiCmF1dGhvcjogJ05ndXllbiBDaGkgRHVuZycKc3VidGl0bGU6ICJEYWlseSBHcmFwaCBTZXJpZXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICMgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6ICJmbGF0bHkiCiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQotLS0KCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNikKYGBgCgojIEVjb25vbWlzdC1TdHlsZSBQbG90IHVzaW5nIFIKICAKIVtdKC9ob21lL2toYW5oYW4vd29yay5wbmcpCgoKIyBSIENvZGVzIGZvciBEYXRhIENsZWFuaW5nIGFuZCBWaXN1YWxpemF0aW9uCgpBYm92ZSBFY29ub21pc3QtU3R5bGUgUGxvdCBjYW4gYmUgY3JlYXRlZCBieSB1c2luZyBSIGFzIGZvbGxvd3M6IAoKYGBge3IsIGV2YWw9RkFMU0V9CgojIExvYWQgc29tZSBwYWNrYWdlczogCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHB3dDkpCmxpYnJhcnkoZ2d0aGVtZXMpCgojIExvYWQgUGVubiBXb3JsZCBUYWJsZSBEYXRhOiAKZGF0YSgicHd0OS4wIikKCiMgUHJlcGFyZSBkYXRhIGZvciBwbG90aW5nOiAKCnNvbWVfY291bnRyaWVzIDwtIGMoIkZyYW5jZSIsICJWaWV0bmFtIiwgIkphcGFuIiwgIlNpbmdhcG9yZSIsICJVbml0ZWQgU3RhdGVzIiwgIlNvdXRoIEtvcmVhIikKCnB3dDkuMSAlPiUgCiAgbXV0YXRlKGNvdW50cnkgPSBhcy5jaGFyYWN0ZXIoY291bnRyeSkpICU+JSAKICBtdXRhdGUoY291bnRyeSA9IGNhc2Vfd2hlbihjb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiIH4gIlVuaXRlZCBTdGF0ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID09ICJSZXB1YmxpYyBvZiBLb3JlYSIgfiAiU291dGggS29yZWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID09ICJWaWV0IE5hbSIgfiAiVmlldG5hbSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBjb3VudHJ5KSkgJT4lIAogIHNlbGVjdCh5ZWFyLCBjb3VudHJ5LCBhdmgpICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIGZpbHRlcih5ZWFyID49IDE5ODYpICU+JSAKICBmaWx0ZXIoY291bnRyeSAlaW4lIHNvbWVfY291bnRyaWVzKSAtPiBkZl9wbG90CgoKIyBNYWtlIGEgZHJhZnQgZ3JhcGg6IAoKbXlfY29sb3JzIDwtICBjKCIjMDQ1MzZlIiwgIiM3YzI4MTciLCAiI2YxNWM0MiIsICIjM2Q2YTUxIiwgIiNlY2EzMjQiLCAiIzEyYTRkYyIpCm15X2ZvbnQgPC0gIlVidW50dSBDb25kZW5zZWQiCmxhYmVsX3kgPC0gYygxOTg2LCByZXAoIiIsIDMpLCAxOTkwLCByZXAoIiIsIDMpLCAxOTk0LCByZXAoIiIsIDMpLCAxOTk4LCByZXAoIiIsIDMpLCAKICAgICAgICAgICAgIDIwMDIsIHJlcCgiIiwgMyksIDIwMDYsIHJlcCgiIiwgMyksIDIwMTAsIHJlcCgiIiwgMyksIDIwMTQsIHJlcCgiIiwgMiksIDIwMTcpCgoKZGZfcGxvdCAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMTk4OCkgJT4lIAogIGZpbHRlcighY291bnRyeSAlaW4lIGMoIlZpZXRuYW0iLCAiU2luZ2Fwb3JlIikpIC0+IGRmX3RleHQxCgpkZl9wbG90ICU+JSAKICBmaWx0ZXIoeWVhciA9PSAxOTg4KSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJTaW5nYXBvcmUiKSkgLT4gZGZfc2luIAoKZGZfcGxvdCAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMTk4OCkgJT4lIAogIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiVmlldG5hbSIpKSAtPiBkZl92aWUKCmRmX3Bsb3QgJT4lIAogIGdncGxvdChhZXMoeWVhciwgYXZoLCBncm91cCA9IGNvdW50cnksIGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAxLjUsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgdGhlbWVfZWNvbm9taXN0KGJhc2VfZmFtaWx5ID0gbXlfZm9udCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlfY29sb3JzKSArIAogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5ODYsIDIwMTcpLCBicmVha3MgPSBzZXEoMTk4NiwgMjAxNywgMSksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsYWJlbF95LCBleHBhbmQgPSBjKDAsIDApKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDE0NTAsIDMwMDApKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgZ2VvbV90ZXh0KGRhdGEgPSBkZl90ZXh0MSwgYWVzKHllYXIsIGF2aCArIDUwLCBsYWJlbCA9IGNvdW50cnkpLCBzaXplID0gNC41LCAKICAgICAgICAgICAgaGp1c3QgPSAwLCBmYW1pbHkgPSBteV9mb250LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fdGV4dChkYXRhID0gZGZfc2luLCBhZXMoeWVhciwgYXZoICsgMTEwLCBsYWJlbCA9IGNvdW50cnkpLCBzaXplID0gNC41LCAKICAgICAgICAgICAgaGp1c3QgPSAwLCBmYW1pbHkgPSBteV9mb250LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fdGV4dChkYXRhID0gZGZfdmllLCBhZXMoeWVhciwgYXZoIC0gNDAsIGxhYmVsID0gY291bnRyeSksIHNpemUgPSA0LjUsIAogICAgICAgICAgICBoanVzdCA9IDAsIGZhbWlseSA9IG15X2ZvbnQsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIsIGNvbG9yID0gImdyZXkxMCIpKSArIAogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJncmV5MjAiKSkgKyAKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJncmV5MzAiLCB2anVzdCA9IC0zKSkgKyAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjcsIDEsIDEsIDEpLCAiY20iKSkgKyAKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIGNvbG9yID0gImdyZXkyMCIpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgY29sb3IgPSAiZ3JleTIwIiwgdmp1c3QgPSA0KSkgKyAKICB0aGVtZShheGlzLnRpY2tzLmxlbmd0aC54ID0gdW5pdCgyLCAibW0iKSkgKyAKICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgYW5udWFsIGhvdXJzIHdvcmtlZCBieSBwZXJzb25zIGVuZ2FnZWQiLCAKICAgICAgIHN1YnRpdGxlID0gIkF2ZXJhZ2UgYW5udWFsIGhvdXJzIHdvcmtlZCBpcyBkZWZpbmVkIGFzIHRoZSB0b3RhbCBudW1iZXIgb2YgaG91cnMgYWN0dWFsbHkgd29ya2VkXG5wZXIgeWVhciBkaXZpZGVkIGJ5IHRoZSBhdmVyYWdlIG51bWJlciBvZiBwZW9wbGUgaW4gZW1wbG95bWVudCBwZXIgeWVhci4iLCAKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBUaGUgUGVubiBXb3JsZCBUYWJsZSAoUFdUKSIpCgoKbGlicmFyeShncmlkKQpncmlkLnJlY3QoeCA9IDAuMDE1LCB5ID0gMC45MywgaGp1c3QgPSAxLCB2anVzdCA9IDAsIGdwID0gZ3BhcihmaWxsID0gIiNlNTAwMWMiLCBsd2QgPSAwKSkgIApncmlkLnJlY3QoeCA9IDEsIHkgPSAxIC0gMC4wMDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLCAgZ3AgPSBncGFyKGZpbGwgPSAiI2U1MDAxYyIsIGx3ZCA9IDApKSAKICAKYGBgCgo=