30 Shortest Countries

R Code for Plot

# Load some R packages: 

library(rvest)
library(tidyverse)
library(hrbrthemes)
my_font <- "Roboto Condensed"

# Collect data: 

"http://worldpopulationreview.com/countries/average-height-by-country/" %>% 
  read_html() %>% 
  html_table() %>% 
  .[[1]] %>% 
  select(X2:X7) %>% 
  slice(-1) -> heightData

# Rename for all columns: 

names(heightData) <- c("country", "male_cm", "female_cm", "male_ft", "female_ft", "popuation")

# Prepare data: 

heightData %>% 
  mutate_at(c("male_cm", "female_cm"), function(x) {x %>% as.numeric()}) -> heightData

only_male <- heightData %>% 
  select(country, male_cm) %>% 
  filter(!is.na(male_cm)) %>% 
  mutate(label_male = as.character(round(male_cm, 1))) %>% 
  mutate(label_male = case_when(str_count(label_male) != 5 ~ paste0(label_male, ".0"), TRUE ~ label_male))

only_female <- heightData %>% 
  select(country, female_cm) %>% 
  filter(!is.na(female_cm)) %>% 
  mutate(label_female = as.character(round(female_cm, 1))) %>% 
  mutate(label_female = case_when(str_count(label_female) != 5 ~ paste0(label_female, ".0"), TRUE ~ label_female))

inner_join(only_female, only_male, by = "country") %>% 
  arrange(male_cm) %>% 
  mutate(country = factor(country, levels = country)) -> df_for_vis

df_for_vis %>% 
  mutate(end_point = female_cm - 3.3) %>% 
  mutate(country_color = case_when(country == "Vietnam" ~ "red", TRUE ~ "white")) -> df_for_vis

# Visualization: 

df_for_vis %>% 
  top_n(-30, wt = male_cm) %>% 
  ggplot(aes(x = country)) + 
  geom_segment(aes(y = female_cm, yend = male_cm, x = country, xend = country), color = "white") + 
  geom_point(aes(x = country, y = male_cm, color = "Male"), size = 4) + 
  geom_point(aes(x = country, y = female_cm, color = "Female"), size = 4) + 
  coord_flip() + 
  theme_modern_rc() + 
  scale_color_manual(name = "", labels = c("Female", "Male"), values = c("yellow", "cyan")) + 
  theme(panel.grid = element_blank()) + 
  theme(axis.text.y = element_text(size = 11, color = "white")) + 
  theme(axis.text.x = element_blank()) + 
  theme(legend.position = c(0.93, 0.5)) + 
  theme(legend.position = "top") + 
  scale_y_continuous(limits = c(138, 180), expand = c(0, 0)) + 
  geom_text(aes(x = country, y =  female_cm, label = label_female), hjust = 1.4, color = "white", size = 4, family = my_font) + 
  geom_text(aes(x = country, y =  male_cm, label = label_male), hjust = -0.4, color = "white", size = 4, family = my_font) + 
  geom_segment(aes(y = 139, yend = end_point, x = country, xend = country), color = "gray80", linetype = 3) + 
  labs(x = NULL, y = NULL, 
       title = "Average Height By 30 Shortest Countries, 2019", 
       subtitle = "Unit of measurement: centimeters.", 
       caption = "Data Source: http://worldpopulationreview.com") + 
  theme(plot.margin = unit(c(1, 1.5, 1, 1), "cm")) + 
  theme(plot.title  = element_text(size = 22)) + 
  theme(plot.subtitle = element_text(size = 12, color = "white")) + 
  theme(plot.caption = element_text(size = 10, face = "italic")) + 
  theme(legend.text = element_text(color = "white", size = 12, family = my_font, face = "bold"))
LS0tDQp0aXRsZTogIkF2ZXJhZ2UgSGVpZ2h0IEJ5IDMwIFNob3J0ZXN0IENvdW50cmllcywgMjAxOSINCnN1YnRpdGxlOiAiRGFpbHkgR3JhcGggU2VyaWVzIg0KYXV0aG9yOiAiTmd1eWVuIENoaSBEdW5nIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgICMgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcucmV0aW5hPTIpDQpgYGANCg0KDQojIDMwIFNob3J0ZXN0IENvdW50cmllcw0KDQohW10oQzpcXFVzZXJzXFxaYm9va1xcRGVza3RvcFxccGljXFxoZWlnaHQuanBnKQ0KDQoNCiMgUiBDb2RlIGZvciBQbG90DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyBMb2FkIHNvbWUgUiBwYWNrYWdlczogDQoNCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaHJicnRoZW1lcykNCm15X2ZvbnQgPC0gIlJvYm90byBDb25kZW5zZWQiDQoNCiMgQ29sbGVjdCBkYXRhOiANCg0KImh0dHA6Ly93b3JsZHBvcHVsYXRpb25yZXZpZXcuY29tL2NvdW50cmllcy9hdmVyYWdlLWhlaWdodC1ieS1jb3VudHJ5LyIgJT4lIA0KICByZWFkX2h0bWwoKSAlPiUgDQogIGh0bWxfdGFibGUoKSAlPiUgDQogIC5bWzFdXSAlPiUgDQogIHNlbGVjdChYMjpYNykgJT4lIA0KICBzbGljZSgtMSkgLT4gaGVpZ2h0RGF0YQ0KDQojIFJlbmFtZSBmb3IgYWxsIGNvbHVtbnM6IA0KDQpuYW1lcyhoZWlnaHREYXRhKSA8LSBjKCJjb3VudHJ5IiwgIm1hbGVfY20iLCAiZmVtYWxlX2NtIiwgIm1hbGVfZnQiLCAiZmVtYWxlX2Z0IiwgInBvcHVhdGlvbiIpDQoNCiMgUHJlcGFyZSBkYXRhOiANCg0KaGVpZ2h0RGF0YSAlPiUgDQogIG11dGF0ZV9hdChjKCJtYWxlX2NtIiwgImZlbWFsZV9jbSIpLCBmdW5jdGlvbih4KSB7eCAlPiUgYXMubnVtZXJpYygpfSkgLT4gaGVpZ2h0RGF0YQ0KDQpvbmx5X21hbGUgPC0gaGVpZ2h0RGF0YSAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCBtYWxlX2NtKSAlPiUgDQogIGZpbHRlcighaXMubmEobWFsZV9jbSkpICU+JSANCiAgbXV0YXRlKGxhYmVsX21hbGUgPSBhcy5jaGFyYWN0ZXIocm91bmQobWFsZV9jbSwgMSkpKSAlPiUgDQogIG11dGF0ZShsYWJlbF9tYWxlID0gY2FzZV93aGVuKHN0cl9jb3VudChsYWJlbF9tYWxlKSAhPSA1IH4gcGFzdGUwKGxhYmVsX21hbGUsICIuMCIpLCBUUlVFIH4gbGFiZWxfbWFsZSkpDQoNCm9ubHlfZmVtYWxlIDwtIGhlaWdodERhdGEgJT4lIA0KICBzZWxlY3QoY291bnRyeSwgZmVtYWxlX2NtKSAlPiUgDQogIGZpbHRlcighaXMubmEoZmVtYWxlX2NtKSkgJT4lIA0KICBtdXRhdGUobGFiZWxfZmVtYWxlID0gYXMuY2hhcmFjdGVyKHJvdW5kKGZlbWFsZV9jbSwgMSkpKSAlPiUgDQogIG11dGF0ZShsYWJlbF9mZW1hbGUgPSBjYXNlX3doZW4oc3RyX2NvdW50KGxhYmVsX2ZlbWFsZSkgIT0gNSB+IHBhc3RlMChsYWJlbF9mZW1hbGUsICIuMCIpLCBUUlVFIH4gbGFiZWxfZmVtYWxlKSkNCg0KaW5uZXJfam9pbihvbmx5X2ZlbWFsZSwgb25seV9tYWxlLCBieSA9ICJjb3VudHJ5IikgJT4lIA0KICBhcnJhbmdlKG1hbGVfY20pICU+JSANCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gY291bnRyeSkpIC0+IGRmX2Zvcl92aXMNCg0KZGZfZm9yX3ZpcyAlPiUgDQogIG11dGF0ZShlbmRfcG9pbnQgPSBmZW1hbGVfY20gLSAzLjMpICU+JSANCiAgbXV0YXRlKGNvdW50cnlfY29sb3IgPSBjYXNlX3doZW4oY291bnRyeSA9PSAiVmlldG5hbSIgfiAicmVkIiwgVFJVRSB+ICJ3aGl0ZSIpKSAtPiBkZl9mb3JfdmlzDQoNCiMgVmlzdWFsaXphdGlvbjogDQoNCmRmX2Zvcl92aXMgJT4lIA0KICB0b3BfbigtMzAsIHd0ID0gbWFsZV9jbSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5KSkgKyANCiAgZ2VvbV9zZWdtZW50KGFlcyh5ID0gZmVtYWxlX2NtLCB5ZW5kID0gbWFsZV9jbSwgeCA9IGNvdW50cnksIHhlbmQgPSBjb3VudHJ5KSwgY29sb3IgPSAid2hpdGUiKSArIA0KICBnZW9tX3BvaW50KGFlcyh4ID0gY291bnRyeSwgeSA9IG1hbGVfY20sIGNvbG9yID0gIk1hbGUiKSwgc2l6ZSA9IDQpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSBjb3VudHJ5LCB5ID0gZmVtYWxlX2NtLCBjb2xvciA9ICJGZW1hbGUiKSwgc2l6ZSA9IDQpICsgDQogIGNvb3JkX2ZsaXAoKSArIA0KICB0aGVtZV9tb2Rlcm5fcmMoKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJGZW1hbGUiLCAiTWFsZSIpLCB2YWx1ZXMgPSBjKCJ5ZWxsb3ciLCAiY3lhbiIpKSArIA0KICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGNvbG9yID0gIndoaXRlIikpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKDAuOTMsIDAuNSkpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygxMzgsIDE4MCksIGV4cGFuZCA9IGMoMCwgMCkpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IGNvdW50cnksIHkgPSAgZmVtYWxlX2NtLCBsYWJlbCA9IGxhYmVsX2ZlbWFsZSksIGhqdXN0ID0gMS40LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA0LCBmYW1pbHkgPSBteV9mb250KSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBjb3VudHJ5LCB5ID0gIG1hbGVfY20sIGxhYmVsID0gbGFiZWxfbWFsZSksIGhqdXN0ID0gLTAuNCwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gNCwgZmFtaWx5ID0gbXlfZm9udCkgKyANCiAgZ2VvbV9zZWdtZW50KGFlcyh5ID0gMTM5LCB5ZW5kID0gZW5kX3BvaW50LCB4ID0gY291bnRyeSwgeGVuZCA9IGNvdW50cnkpLCBjb2xvciA9ICJncmF5ODAiLCBsaW5ldHlwZSA9IDMpICsgDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCANCiAgICAgICB0aXRsZSA9ICJBdmVyYWdlIEhlaWdodCBCeSAzMCBTaG9ydGVzdCBDb3VudHJpZXMsIDIwMTkiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJVbml0IG9mIG1lYXN1cmVtZW50OiBjZW50aW1ldGVycy4iLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBodHRwOi8vd29ybGRwb3B1bGF0aW9ucmV2aWV3LmNvbSIpICsgDQogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEuNSwgMSwgMSksICJjbSIpKSArIA0KICB0aGVtZShwbG90LnRpdGxlICA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpKSArIA0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAid2hpdGUiKSkgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJpdGFsaWMiKSkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTIsIGZhbWlseSA9IG15X2ZvbnQsIGZhY2UgPSAiYm9sZCIpKQ0KDQpgYGANCg0K