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==