Gap in Life expectancy between Male and Female

#==============================
#   Collect and clean data
#==============================

# Load some packages: 
library(tidyverse)
library(rvest)

# Extract data from link: 
link <- "https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy?fbclid=IwAR0jRtf0RacPLxVPgcuu4zgYJl9HDk01cNy6u48vvyTuoK9CC1jZH8_pZPQ"


# Extract data: 

link %>% 
  read_html() %>% 
  html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[2]') %>% 
  html_table(fill = TRUE) %>% 
  .[[1]] -> data_raw


# Rename for columns: 
names(data_raw) <- c("Rank", "Country", "Both", "Female", "Male")

# Remove the first row: 
data_raw %>% filter(Rank != "Rank") -> data_raw

# Conver to numeric and remove missing data: 

data_raw %>% 
  mutate(Country = factor(Country)) %>% 
  mutate_if(is.character, as.numeric) %>% 
  mutate(Country = as.character(Country)) %>% 
  mutate(Country = case_when(str_detect(Country, "Republic of China") ~ "China", TRUE ~ Country)) %>% 
  na.omit() -> df_life


# Select some countries with biggest gap in life expectancy: 
n <- 25

df_life %>% 
  filter(!Country %in% c("Kiribati", "Eswatini")) %>% 
  mutate(lifeGap = Female - Male) %>% 
  arrange(-lifeGap) %>% 
  slice(1:n) %>% 
  arrange(Female) %>% 
  mutate(Country = factor(Country, levels = Country)) %>% 
  mutate(diffLabel = round(lifeGap, 1)) %>% 
  mutate(diffLabel = as.character(diffLabel)) %>% 
  mutate(MaleLabel = as.character(Male), FemaleLabel = as.character(Female)) %>% 
  mutate(MaleLabel = case_when(!str_detect(MaleLabel, "\\.") ~ paste0(MaleLabel, ".0"), TRUE ~ MaleLabel)) %>% 
  mutate(FemaleLabel = case_when(!str_detect(FemaleLabel, "\\.") ~ paste0(FemaleLabel, ".0"), TRUE ~ FemaleLabel)) %>% 
  mutate(diffLabel = case_when(!str_detect(diffLabel, "\\.") ~ paste0(diffLabel, ".0"), TRUE ~ diffLabel)) %>% 
  mutate(DIFF = "DIFF") -> df


# Filter Estonia: 
df %>% filter(Country == "Estonia") -> dfEstonia


#======================
#  Solution 1 for plot
#======================

library(ggalt)

h <- 0.8
h1 <- 84.2
h2 <- h1 + 1
h3 <- -1.8
maleColor <- "#2859C9"
femaleColor <- "#B92F77"
my_font <- "Ubuntu Condensed"


df %>% 
  ggplot(aes(y = Country)) + 
  geom_dumbbell(aes(x = Male, xend = Female), size = 1.5, color = "#b2b2b2", 
                colour_x = maleColor, colour_xend = femaleColor, size_x = 4.2, size_xend = 4.2) + 
  geom_text(aes(x = Male - h, label = Male), color = maleColor, family = my_font, fontface = "bold") + 
  geom_text(aes(x = Female + h, label = Female), color = femaleColor, family = my_font, fontface = "bold") + 
  geom_rect(aes(xmin = h1, xmax = h2, ymin = -Inf, ymax = Inf), fill = "#efefe3") + 
  scale_y_discrete(expand = c(0.075, 0)) + 
  geom_text(data = dfEstonia, aes(label = "DIFF", x = (h1 + h2) / 2, y = Country), 
            fontface = "bold", family = my_font, vjust = h3) +
  geom_text(data = dfEstonia, aes(label = "Male", x = Male, y = Country), size = 4, 
            fontface = "bold", family = my_font, vjust = h3, color = maleColor) + 
  geom_text(data = dfEstonia, aes(label = "Female", x = Female, y = Country), size = 4, 
            fontface = "bold", family = my_font, vjust = h3, color = femaleColor) + 
  geom_text(aes(label = diffLabel, x = (h1 + h2) / 2, y = Country), 
            fontface = "bold", family = my_font, color = "gray30") + 
  theme_minimal(base_family = my_font) + 
  theme(panel.grid.minor = element_blank()) +
  theme(plot.background = element_rect(fill = "seashell", color = NA)) + 
  theme(axis.title = element_blank()) + 
  theme(axis.text.x = element_blank()) + 
  theme(panel.grid.major.x = element_blank()) + 
  theme(plot.margin = unit(c(1.3, 1.3, 1.3, 1.3), "cm")) + 
  theme(axis.text.y = element_text(size = 13, family = my_font)) + 
  theme(plot.title = element_text(size = 22, family = my_font, color = "gray20")) + 
  theme(plot.caption = element_text(size = 11, face = "italic", color = "grey30")) + 
  theme(plot.subtitle = element_text(size = 14, color = "grey30")) + 
  labs(x = NULL, y = NULL, 
       title = "Gender gap in life expectancy across 25 countries",
       subtitle = "Note: By descending order of female life expectancy", 
       caption = "Data Source: United Nations Development Programme") 

LS0tCnRpdGxlOiAnR2FwIGluIExpZmUgZXhwZWN0YW5jeSBiZXR3ZWVuIE1hbGUgYW5kIEZlbWFsZSwgMjAxOCcKYXV0aG9yOiAnTmd1eWVuIENoaSBEdW5nJwpzdWJ0aXRsZTogIkRhaWx5IEdyYXBoIFNlcmllcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiAiZmxhdGx5IgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCgojIEdhcCBpbiBMaWZlIGV4cGVjdGFuY3kgYmV0d2VlbiBNYWxlIGFuZCBGZW1hbGUKCmBgYHtyLCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD05fQoKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojICAgQ29sbGVjdCBhbmQgY2xlYW4gZGF0YQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIExvYWQgc29tZSBwYWNrYWdlczogCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJ2ZXN0KQoKIyBFeHRyYWN0IGRhdGEgZnJvbSBsaW5rOiAKbGluayA8LSAiaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9jb3VudHJpZXNfYnlfbGlmZV9leHBlY3RhbmN5P2ZiY2xpZD1Jd0FSMGpSdGYwUmFjUEx4VlBnY3V1NHpnWUpsOUhEazAxY055NnU0OHZ2eVR1b0s5Q0MxalpIOF9wWlBRIgoKCiMgRXh0cmFjdCBkYXRhOiAKCmxpbmsgJT4lIAogIHJlYWRfaHRtbCgpICU+JSAKICBodG1sX25vZGVzKHhwYXRoID0gJy8vKltAaWQ9Im13LWNvbnRlbnQtdGV4dCJdL2Rpdi90YWJsZVsyXScpICU+JSAKICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKSAlPiUgCiAgLltbMV1dIC0+IGRhdGFfcmF3CgoKIyBSZW5hbWUgZm9yIGNvbHVtbnM6IApuYW1lcyhkYXRhX3JhdykgPC0gYygiUmFuayIsICJDb3VudHJ5IiwgIkJvdGgiLCAiRmVtYWxlIiwgIk1hbGUiKQoKIyBSZW1vdmUgdGhlIGZpcnN0IHJvdzogCmRhdGFfcmF3ICU+JSBmaWx0ZXIoUmFuayAhPSAiUmFuayIpIC0+IGRhdGFfcmF3CgojIENvbnZlciB0byBudW1lcmljIGFuZCByZW1vdmUgbWlzc2luZyBkYXRhOiAKCmRhdGFfcmF3ICU+JSAKICBtdXRhdGUoQ291bnRyeSA9IGZhY3RvcihDb3VudHJ5KSkgJT4lIAogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpICU+JSAKICBtdXRhdGUoQ291bnRyeSA9IGFzLmNoYXJhY3RlcihDb3VudHJ5KSkgJT4lIAogIG11dGF0ZShDb3VudHJ5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoQ291bnRyeSwgIlJlcHVibGljIG9mIENoaW5hIikgfiAiQ2hpbmEiLCBUUlVFIH4gQ291bnRyeSkpICU+JSAKICBuYS5vbWl0KCkgLT4gZGZfbGlmZQoKCiMgU2VsZWN0IHNvbWUgY291bnRyaWVzIHdpdGggYmlnZ2VzdCBnYXAgaW4gbGlmZSBleHBlY3RhbmN5OiAKbiA8LSAyNQoKZGZfbGlmZSAlPiUgCiAgZmlsdGVyKCFDb3VudHJ5ICVpbiUgYygiS2lyaWJhdGkiLCAiRXN3YXRpbmkiKSkgJT4lIAogIG11dGF0ZShsaWZlR2FwID0gRmVtYWxlIC0gTWFsZSkgJT4lIAogIGFycmFuZ2UoLWxpZmVHYXApICU+JSAKICBzbGljZSgxOm4pICU+JSAKICBhcnJhbmdlKEZlbWFsZSkgJT4lIAogIG11dGF0ZShDb3VudHJ5ID0gZmFjdG9yKENvdW50cnksIGxldmVscyA9IENvdW50cnkpKSAlPiUgCiAgbXV0YXRlKGRpZmZMYWJlbCA9IHJvdW5kKGxpZmVHYXAsIDEpKSAlPiUgCiAgbXV0YXRlKGRpZmZMYWJlbCA9IGFzLmNoYXJhY3RlcihkaWZmTGFiZWwpKSAlPiUgCiAgbXV0YXRlKE1hbGVMYWJlbCA9IGFzLmNoYXJhY3RlcihNYWxlKSwgRmVtYWxlTGFiZWwgPSBhcy5jaGFyYWN0ZXIoRmVtYWxlKSkgJT4lIAogIG11dGF0ZShNYWxlTGFiZWwgPSBjYXNlX3doZW4oIXN0cl9kZXRlY3QoTWFsZUxhYmVsLCAiXFwuIikgfiBwYXN0ZTAoTWFsZUxhYmVsLCAiLjAiKSwgVFJVRSB+IE1hbGVMYWJlbCkpICU+JSAKICBtdXRhdGUoRmVtYWxlTGFiZWwgPSBjYXNlX3doZW4oIXN0cl9kZXRlY3QoRmVtYWxlTGFiZWwsICJcXC4iKSB+IHBhc3RlMChGZW1hbGVMYWJlbCwgIi4wIiksIFRSVUUgfiBGZW1hbGVMYWJlbCkpICU+JSAKICBtdXRhdGUoZGlmZkxhYmVsID0gY2FzZV93aGVuKCFzdHJfZGV0ZWN0KGRpZmZMYWJlbCwgIlxcLiIpIH4gcGFzdGUwKGRpZmZMYWJlbCwgIi4wIiksIFRSVUUgfiBkaWZmTGFiZWwpKSAlPiUgCiAgbXV0YXRlKERJRkYgPSAiRElGRiIpIC0+IGRmCgoKIyBGaWx0ZXIgRXN0b25pYTogCmRmICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiRXN0b25pYSIpIC0+IGRmRXN0b25pYQoKCiM9PT09PT09PT09PT09PT09PT09PT09CiMgIFNvbHV0aW9uIDEgZm9yIHBsb3QKIz09PT09PT09PT09PT09PT09PT09PT0KCmxpYnJhcnkoZ2dhbHQpCgpoIDwtIDAuOApoMSA8LSA4NC4yCmgyIDwtIGgxICsgMQpoMyA8LSAtMS44Cm1hbGVDb2xvciA8LSAiIzI4NTlDOSIKZmVtYWxlQ29sb3IgPC0gIiNCOTJGNzciCm15X2ZvbnQgPC0gIlVidW50dSBDb25kZW5zZWQiCgoKZGYgJT4lIAogIGdncGxvdChhZXMoeSA9IENvdW50cnkpKSArIAogIGdlb21fZHVtYmJlbGwoYWVzKHggPSBNYWxlLCB4ZW5kID0gRmVtYWxlKSwgc2l6ZSA9IDEuNSwgY29sb3IgPSAiI2IyYjJiMiIsIAogICAgICAgICAgICAgICAgY29sb3VyX3ggPSBtYWxlQ29sb3IsIGNvbG91cl94ZW5kID0gZmVtYWxlQ29sb3IsIHNpemVfeCA9IDQuMiwgc2l6ZV94ZW5kID0gNC4yKSArIAogIGdlb21fdGV4dChhZXMoeCA9IE1hbGUgLSBoLCBsYWJlbCA9IE1hbGUpLCBjb2xvciA9IG1hbGVDb2xvciwgZmFtaWx5ID0gbXlfZm9udCwgZm9udGZhY2UgPSAiYm9sZCIpICsgCiAgZ2VvbV90ZXh0KGFlcyh4ID0gRmVtYWxlICsgaCwgbGFiZWwgPSBGZW1hbGUpLCBjb2xvciA9IGZlbWFsZUNvbG9yLCBmYW1pbHkgPSBteV9mb250LCBmb250ZmFjZSA9ICJib2xkIikgKyAKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSBoMSwgeG1heCA9IGgyLCB5bWluID0gLUluZiwgeW1heCA9IEluZiksIGZpbGwgPSAiI2VmZWZlMyIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAuMDc1LCAwKSkgKyAKICBnZW9tX3RleHQoZGF0YSA9IGRmRXN0b25pYSwgYWVzKGxhYmVsID0gIkRJRkYiLCB4ID0gKGgxICsgaDIpIC8gMiwgeSA9IENvdW50cnkpLCAKICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIsIGZhbWlseSA9IG15X2ZvbnQsIHZqdXN0ID0gaDMpICsKICBnZW9tX3RleHQoZGF0YSA9IGRmRXN0b25pYSwgYWVzKGxhYmVsID0gIk1hbGUiLCB4ID0gTWFsZSwgeSA9IENvdW50cnkpLCBzaXplID0gNCwgCiAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiLCBmYW1pbHkgPSBteV9mb250LCB2anVzdCA9IGgzLCBjb2xvciA9IG1hbGVDb2xvcikgKyAKICBnZW9tX3RleHQoZGF0YSA9IGRmRXN0b25pYSwgYWVzKGxhYmVsID0gIkZlbWFsZSIsIHggPSBGZW1hbGUsIHkgPSBDb3VudHJ5KSwgc2l6ZSA9IDQsIAogICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gbXlfZm9udCwgdmp1c3QgPSBoMywgY29sb3IgPSBmZW1hbGVDb2xvcikgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZGlmZkxhYmVsLCB4ID0gKGgxICsgaDIpIC8gMiwgeSA9IENvdW50cnkpLCAKICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIsIGZhbWlseSA9IG15X2ZvbnQsIGNvbG9yID0gImdyYXkzMCIpICsgCiAgdGhlbWVfbWluaW1hbChiYXNlX2ZhbWlseSA9IG15X2ZvbnQpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInNlYXNoZWxsIiwgY29sb3IgPSBOQSkpICsgCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMS4zLCAxLjMsIDEuMywgMS4zKSwgImNtIikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzLCBmYW1pbHkgPSBteV9mb250KSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiwgZmFtaWx5ID0gbXlfZm9udCwgY29sb3IgPSAiZ3JheTIwIikpICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgZmFjZSA9ICJpdGFsaWMiLCBjb2xvciA9ICJncmV5MzAiKSkgKyAKICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiZ3JleTMwIikpICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIAogICAgICAgdGl0bGUgPSAiR2VuZGVyIGdhcCBpbiBsaWZlIGV4cGVjdGFuY3kgYWNyb3NzIDI1IGNvdW50cmllcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJOb3RlOiBCeSBkZXNjZW5kaW5nIG9yZGVyIG9mIGZlbWFsZSBsaWZlIGV4cGVjdGFuY3kiLCAKICAgICAgIGNhcHRpb24gPSAiRGF0YSBTb3VyY2U6IFVuaXRlZCBOYXRpb25zIERldmVsb3BtZW50IFByb2dyYW1tZSIpIAogIAoKCmBgYAoKCgoK