Economist-Style Plot using R

Origin of the plot can be found here. This plot can be replicated by using R as follows:

R Codes for Data Cleaning and Visualization

Data can be downloaded here.

# Load Data: 
library(tidyverse)
df <- read.table("/home/khanhan/Downloads/NCD_RisC_Lancet_2016_BP_age_standardised_countries.txt", sep = ",")
df %>% select(1:5) -> df

# Rename for columns: 
new_names <- c("Country", "ISO", "Gender", "Year", "Prevalence")
names(df) <- new_names

# Remove the first row and retain observations in 2015: 
df %>% 
  slice(-1) %>% 
  filter(Year == "2015") -> df_2015

full_join(df_2015 %>% filter(Gender == "Men") %>% select(Country, PrevalenceMen = Prevalence), 
          df_2015 %>% filter(Gender == "Women") %>% select(Country, PrevalenceWomen = Prevalence), by = "Country") -> df2015plot

# Central and Eastern Europe Countries: 

library(rvest)

read_html("https://en.wikipedia.org/wiki/Central_and_Eastern_Europe") %>% 
  html_nodes("p+ ul li > a:nth-child(1)") %>% 
  html_text() -> central_easternCountry

central_easternCountry <- central_easternCountry[-c(5, 6)]
central_easternCountry <- case_when(str_detect(central_easternCountry, "North") ~ "Macedonia", TRUE ~ central_easternCountry)
central_easternCountry <- c("Russia", central_easternCountry)

# High-Income Western Countries: 

library(wbstats)
general_information <-  wb_cachelist
m <- general_information[[1]]

m %>% 
  filter(region == "Europe & Central Asia") %>% 
  filter(income == "High income") %>% 
  pull(country) -> highIncomeCountry

# Sub-Saharan Africa Countries: 

m %>% 
  filter(region == "Sub-Saharan Africa ") %>% 
  pull(country) -> subSahAfri

case_when(str_detect(subSahAfri, "Congo, Dem. Rep.") ~ "DR Congo", 
          str_detect(subSahAfri, "Congo, Rep.") ~ "Congo", 
          TRUE ~ subSahAfri) -> subSahAfri

# Create Region column: 

df2015plot %>% 
  mutate_all(as.character) %>% 
  mutate(Country = case_when(Country == "United States of America" ~ "United States", 
                             Country == "Russian Federation" ~ "Russia", 
                             Country == "United Kingdom" ~ "Britain", 
                             TRUE ~ Country)) %>% 
  mutate_at(c("PrevalenceMen", "PrevalenceWomen"), .funs = as.numeric) %>% 
  mutate(Region = case_when(Country %in% central_easternCountry ~ "Central and Eastern Europe", 
                            Country %in% highIncomeCountry ~ "High-Income Western", 
                            Country %in% subSahAfri ~ "Sub-Saharan Africa", 
                            TRUE ~ "Others")) -> df_final

# Make a draft: 

library(scales)
library(ggrepel)

levels <- c("Central and Eastern Europe", "High-Income Western", "Sub-Saharan Africa", "Others")
my_colors <- c("#f15b40", "#eca221", "#00526d", "#b0c6d2")
my_font <- "Ubuntu Condensed"

df_final %>% 
  mutate(Region = factor(Region, levels = levels)) %>% 
  mutate_if(is.numeric, function(x) {rescale(x, to = c(0, 40))}) -> df_final

df_ground <- tibble(PrevalenceWomen = 0:40, PrevalenceMen = 0:40)

some_countries <- c("Russia", "Viet Nam", "Croatia", "India", "Nigeria", 
                    "Germany", "Thailand", "United States", "Singapore") 

df_mini <- df_final %>% filter(Country %in% some_countries)

df_final %>% 
  ggplot(aes(PrevalenceWomen, PrevalenceMen)) + 
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = my_colors[3], size = 0.8, alpha = 0.6) + 
  geom_area(data = df_ground, aes(x = PrevalenceWomen, y = PrevalenceMen), fill = "#E9F2F7", alpha = 0.6) + 
  geom_point(size = 5, aes(color = Region)) + 
  geom_point(aes(x = PrevalenceWomen, y = PrevalenceMen, color = Region), data = df_mini, 
             shape = 21, size = 5, color = "black") + 
  theme_minimal(base_family = my_font) + 
  scale_y_continuous(limits = c(0, 40)) + 
  scale_x_continuous(limits = c(0, 40)) + 
  scale_color_manual(values = my_colors) + 
  theme(panel.grid.major = element_line(colour = "#dbe2e7", size = 0.5)) + 
  theme(panel.grid.minor = element_blank()) + 
  theme(legend.title = element_blank()) + 
  theme(legend.position = "top") + 
  geom_text_repel(data = df_mini, family = my_font, color = "grey20", size = 5, force = 19,
            aes(x = PrevalenceWomen, y = PrevalenceMen, label = Country)) + 
  theme(plot.margin = unit(rep(1, 4), "cm")) + 
  theme(plot.title = element_text(size = 22, color = "grey20")) +
  theme(plot.subtitle = element_text(size = 16, color = "grey30")) + 
  theme(plot.caption = element_text(size = 12, color = "grey30")) + 
  theme(axis.title = element_text(size = 15, color = "grey15")) + 
  theme(axis.text = element_text(size = 15, color = "grey15")) + 
  theme(legend.text = element_text(color = "grey30", size = 15)) + 
  labs(title = "Matters of the heart",
       subtitle = "Prevalance of raised blood pressure*, by sex, 2015, %",
       caption = "Source: MCD Risk Factor Collaboration",
       x = "Woman",
       y = "Man")

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)) 
LS0tCnRpdGxlOiAiTWF0dGVycyBvZiB0aGUgaGVhcnQiCmF1dGhvcjogJ05ndXllbiBDaGkgRHVuZycKc3VidGl0bGU6ICJEYWlseSBHcmFwaCBTZXJpZXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICMgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6ICJmbGF0bHkiCiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQotLS0KCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNikKYGBgCgojIEVjb25vbWlzdC1TdHlsZSBQbG90IHVzaW5nIFIKCk9yaWdpbiBvZiB0aGUgcGxvdCBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vd3d3LmVjb25vbWlzdC5jb20vc2l0ZXMvZGVmYXVsdC9maWxlcy8yMDE3MDEyNF9XT0M1MDBfMi5wbmcpLiBUaGlzIHBsb3QgY2FuIGJlIHJlcGxpY2F0ZWQgYnkgdXNpbmcgUiBhcyBmb2xsb3dzOiAKICAKIVtdKC9ob21lL2toYW5oYW4vcHJlc3N1cmUucG5nKQoKCiMgUiBDb2RlcyBmb3IgRGF0YSBDbGVhbmluZyBhbmQgVmlzdWFsaXphdGlvbgoKRGF0YSBjYW4gYmUgZG93bmxvYWRlZCBbaGVyZV0oaHR0cDovL3d3dy5uY2RyaXNjLm9yZy9kYXRhLWRvd25sb2Fkcy1ibG9vZC1wcmVzc3VyZS5odG1sKS4gCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBMb2FkIERhdGE6IApsaWJyYXJ5KHRpZHl2ZXJzZSkKZGYgPC0gcmVhZC50YWJsZSgiL2hvbWUva2hhbmhhbi9Eb3dubG9hZHMvTkNEX1Jpc0NfTGFuY2V0XzIwMTZfQlBfYWdlX3N0YW5kYXJkaXNlZF9jb3VudHJpZXMudHh0Iiwgc2VwID0gIiwiKQpkZiAlPiUgc2VsZWN0KDE6NSkgLT4gZGYKCiMgUmVuYW1lIGZvciBjb2x1bW5zOiAKbmV3X25hbWVzIDwtIGMoIkNvdW50cnkiLCAiSVNPIiwgIkdlbmRlciIsICJZZWFyIiwgIlByZXZhbGVuY2UiKQpuYW1lcyhkZikgPC0gbmV3X25hbWVzCgojIFJlbW92ZSB0aGUgZmlyc3Qgcm93IGFuZCByZXRhaW4gb2JzZXJ2YXRpb25zIGluIDIwMTU6IApkZiAlPiUgCiAgc2xpY2UoLTEpICU+JSAKICBmaWx0ZXIoWWVhciA9PSAiMjAxNSIpIC0+IGRmXzIwMTUKCmZ1bGxfam9pbihkZl8yMDE1ICU+JSBmaWx0ZXIoR2VuZGVyID09ICJNZW4iKSAlPiUgc2VsZWN0KENvdW50cnksIFByZXZhbGVuY2VNZW4gPSBQcmV2YWxlbmNlKSwgCiAgICAgICAgICBkZl8yMDE1ICU+JSBmaWx0ZXIoR2VuZGVyID09ICJXb21lbiIpICU+JSBzZWxlY3QoQ291bnRyeSwgUHJldmFsZW5jZVdvbWVuID0gUHJldmFsZW5jZSksIGJ5ID0gIkNvdW50cnkiKSAtPiBkZjIwMTVwbG90CgojIENlbnRyYWwgYW5kIEVhc3Rlcm4gRXVyb3BlIENvdW50cmllczogCgpsaWJyYXJ5KHJ2ZXN0KQoKcmVhZF9odG1sKCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DZW50cmFsX2FuZF9FYXN0ZXJuX0V1cm9wZSIpICU+JSAKICBodG1sX25vZGVzKCJwKyB1bCBsaSA+IGE6bnRoLWNoaWxkKDEpIikgJT4lIAogIGh0bWxfdGV4dCgpIC0+IGNlbnRyYWxfZWFzdGVybkNvdW50cnkKCmNlbnRyYWxfZWFzdGVybkNvdW50cnkgPC0gY2VudHJhbF9lYXN0ZXJuQ291bnRyeVstYyg1LCA2KV0KY2VudHJhbF9lYXN0ZXJuQ291bnRyeSA8LSBjYXNlX3doZW4oc3RyX2RldGVjdChjZW50cmFsX2Vhc3Rlcm5Db3VudHJ5LCAiTm9ydGgiKSB+ICJNYWNlZG9uaWEiLCBUUlVFIH4gY2VudHJhbF9lYXN0ZXJuQ291bnRyeSkKY2VudHJhbF9lYXN0ZXJuQ291bnRyeSA8LSBjKCJSdXNzaWEiLCBjZW50cmFsX2Vhc3Rlcm5Db3VudHJ5KQoKIyBIaWdoLUluY29tZSBXZXN0ZXJuIENvdW50cmllczogCgpsaWJyYXJ5KHdic3RhdHMpCmdlbmVyYWxfaW5mb3JtYXRpb24gPC0gIHdiX2NhY2hlbGlzdAptIDwtIGdlbmVyYWxfaW5mb3JtYXRpb25bWzFdXQoKbSAlPiUgCiAgZmlsdGVyKHJlZ2lvbiA9PSAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIikgJT4lIAogIGZpbHRlcihpbmNvbWUgPT0gIkhpZ2ggaW5jb21lIikgJT4lIAogIHB1bGwoY291bnRyeSkgLT4gaGlnaEluY29tZUNvdW50cnkKCiMgU3ViLVNhaGFyYW4gQWZyaWNhIENvdW50cmllczogCgptICU+JSAKICBmaWx0ZXIocmVnaW9uID09ICJTdWItU2FoYXJhbiBBZnJpY2EgIikgJT4lIAogIHB1bGwoY291bnRyeSkgLT4gc3ViU2FoQWZyaQoKY2FzZV93aGVuKHN0cl9kZXRlY3Qoc3ViU2FoQWZyaSwgIkNvbmdvLCBEZW0uIFJlcC4iKSB+ICJEUiBDb25nbyIsIAogICAgICAgICAgc3RyX2RldGVjdChzdWJTYWhBZnJpLCAiQ29uZ28sIFJlcC4iKSB+ICJDb25nbyIsIAogICAgICAgICAgVFJVRSB+IHN1YlNhaEFmcmkpIC0+IHN1YlNhaEFmcmkKCiMgQ3JlYXRlIFJlZ2lvbiBjb2x1bW46IAoKZGYyMDE1cGxvdCAlPiUgCiAgbXV0YXRlX2FsbChhcy5jaGFyYWN0ZXIpICU+JSAKICBtdXRhdGUoQ291bnRyeSA9IGNhc2Vfd2hlbihDb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiIH4gIlVuaXRlZCBTdGF0ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5ID09ICJSdXNzaWFuIEZlZGVyYXRpb24iIH4gIlJ1c3NpYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgPT0gIlVuaXRlZCBLaW5nZG9tIiB+ICJCcml0YWluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IENvdW50cnkpKSAlPiUgCiAgbXV0YXRlX2F0KGMoIlByZXZhbGVuY2VNZW4iLCAiUHJldmFsZW5jZVdvbWVuIiksIC5mdW5zID0gYXMubnVtZXJpYykgJT4lIAogIG11dGF0ZShSZWdpb24gPSBjYXNlX3doZW4oQ291bnRyeSAlaW4lIGNlbnRyYWxfZWFzdGVybkNvdW50cnkgfiAiQ2VudHJhbCBhbmQgRWFzdGVybiBFdXJvcGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgJWluJSBoaWdoSW5jb21lQ291bnRyeSB+ICJIaWdoLUluY29tZSBXZXN0ZXJuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5ICVpbiUgc3ViU2FoQWZyaSB+ICJTdWItU2FoYXJhbiBBZnJpY2EiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXJzIikpIC0+IGRmX2ZpbmFsCgojIE1ha2UgYSBkcmFmdDogCgpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShnZ3JlcGVsKQoKbGV2ZWxzIDwtIGMoIkNlbnRyYWwgYW5kIEVhc3Rlcm4gRXVyb3BlIiwgIkhpZ2gtSW5jb21lIFdlc3Rlcm4iLCAiU3ViLVNhaGFyYW4gQWZyaWNhIiwgIk90aGVycyIpCm15X2NvbG9ycyA8LSBjKCIjZjE1YjQwIiwgIiNlY2EyMjEiLCAiIzAwNTI2ZCIsICIjYjBjNmQyIikKbXlfZm9udCA8LSAiVWJ1bnR1IENvbmRlbnNlZCIKCmRmX2ZpbmFsICU+JSAKICBtdXRhdGUoUmVnaW9uID0gZmFjdG9yKFJlZ2lvbiwgbGV2ZWxzID0gbGV2ZWxzKSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmdW5jdGlvbih4KSB7cmVzY2FsZSh4LCB0byA9IGMoMCwgNDApKX0pIC0+IGRmX2ZpbmFsCgpkZl9ncm91bmQgPC0gdGliYmxlKFByZXZhbGVuY2VXb21lbiA9IDA6NDAsIFByZXZhbGVuY2VNZW4gPSAwOjQwKQoKc29tZV9jb3VudHJpZXMgPC0gYygiUnVzc2lhIiwgIlZpZXQgTmFtIiwgIkNyb2F0aWEiLCAiSW5kaWEiLCAiTmlnZXJpYSIsIAogICAgICAgICAgICAgICAgICAgICJHZXJtYW55IiwgIlRoYWlsYW5kIiwgIlVuaXRlZCBTdGF0ZXMiLCAiU2luZ2Fwb3JlIikgCgpkZl9taW5pIDwtIGRmX2ZpbmFsICU+JSBmaWx0ZXIoQ291bnRyeSAlaW4lIHNvbWVfY291bnRyaWVzKQoKZGZfZmluYWwgJT4lIAogIGdncGxvdChhZXMoUHJldmFsZW5jZVdvbWVuLCBQcmV2YWxlbmNlTWVuKSkgKyAKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gbXlfY29sb3JzWzNdLCBzaXplID0gMC44LCBhbHBoYSA9IDAuNikgKyAKICBnZW9tX2FyZWEoZGF0YSA9IGRmX2dyb3VuZCwgYWVzKHggPSBQcmV2YWxlbmNlV29tZW4sIHkgPSBQcmV2YWxlbmNlTWVuKSwgZmlsbCA9ICIjRTlGMkY3IiwgYWxwaGEgPSAwLjYpICsgCiAgZ2VvbV9wb2ludChzaXplID0gNSwgYWVzKGNvbG9yID0gUmVnaW9uKSkgKyAKICBnZW9tX3BvaW50KGFlcyh4ID0gUHJldmFsZW5jZVdvbWVuLCB5ID0gUHJldmFsZW5jZU1lbiwgY29sb3IgPSBSZWdpb24pLCBkYXRhID0gZGZfbWluaSwgCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCBzaXplID0gNSwgY29sb3IgPSAiYmxhY2siKSArIAogIHRoZW1lX21pbmltYWwoYmFzZV9mYW1pbHkgPSBteV9mb250KSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDQwKSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA0MCkpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15X2NvbG9ycykgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjZGJlMmU3Iiwgc2l6ZSA9IDAuNSkpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsgCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZl9taW5pLCBmYW1pbHkgPSBteV9mb250LCBjb2xvciA9ICJncmV5MjAiLCBzaXplID0gNSwgZm9yY2UgPSAxOSwKICAgICAgICAgICAgYWVzKHggPSBQcmV2YWxlbmNlV29tZW4sIHkgPSBQcmV2YWxlbmNlTWVuLCBsYWJlbCA9IENvdW50cnkpKSArIAogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChyZXAoMSwgNCksICJjbSIpKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyLCBjb2xvciA9ICJncmV5MjAiKSkgKwogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBjb2xvciA9ICJncmV5MzAiKSkgKyAKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJncmV5MzAiKSkgKyAKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3IgPSAiZ3JleTE1IikpICsgCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3IgPSAiZ3JleTE1IikpICsgCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZ3JleTMwIiwgc2l6ZSA9IDE1KSkgKyAKICBsYWJzKHRpdGxlID0gIk1hdHRlcnMgb2YgdGhlIGhlYXJ0IiwKICAgICAgIHN1YnRpdGxlID0gIlByZXZhbGFuY2Ugb2YgcmFpc2VkIGJsb29kIHByZXNzdXJlKiwgYnkgc2V4LCAyMDE1LCAlIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBNQ0QgUmlzayBGYWN0b3IgQ29sbGFib3JhdGlvbiIsCiAgICAgICB4ID0gIldvbWFuIiwKICAgICAgIHkgPSAiTWFuIikKCmxpYnJhcnkoZ3JpZCkKZ3JpZC5yZWN0KHggPSAwLjAxNSwgeSA9IDAuOTMsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLCBncCA9IGdwYXIoZmlsbCA9ICIjZTUwMDFjIiwgbHdkID0gMCkpICAKZ3JpZC5yZWN0KHggPSAxLCB5ID0gMSAtIDAuMDA1LCBoanVzdCA9IDEsIHZqdXN0ID0gMCwgIGdwID0gZ3BhcihmaWxsID0gIiNlNTAwMWMiLCBsd2QgPSAwKSkgCgpgYGAKCg==