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=