Data Source and Description

In this post I will present R codes for collecting population data provided by U.S. Census Bureau with inputs are given country code and year selected. In addition, R codes for making Population Pyramids for Vietnam in 2018 are shown.

Population Pyramid Graph

R codes for this graph:

#==================================================================================
#   Scrapping population data with inputs are: 
#   1. Given year, 
#   2. Country code selected from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
#==================================================================================

# Clear workspace: 
rm(list = ls())

# Load some packages for scrapping data and data manipulation: 
library(rvest)
library(magrittr)
library(tidyverse)
library(extrafont)

# A function for collecting population data: 

get_population <- function(countryCode_selected, year_selected) {
  
  base_url <- "https://www.census.gov/data-tools/demo/idb/region.php?N=%20Results%20&T=10&A=separate&RT=0&Y="
  link <- paste0(paste0(paste0(base_url, year_selected), "&R=-1&C="), countryCode_selected)
  
  link %>% 
    read_html() -> html_content  
  
  html_content %>% 
    html_table(fill = TRUE) %>% 
    .[[1]] -> pop_df
  
  names(pop_df) <- str_replace_all(names(pop_df), " ", "_")
  
  country_name <- html_content %>% 
    html_nodes('.query_source a') %>% 
    html_text() 
  
  if (length(country_name) == 2) {
    country_name <- country_name[2]
  }
  
  
  final_df <- pop_df %>% 
    select(-Year, -Age, -contains("Percent"), -Sex_Ratio) %>% 
    mutate_all(function(x) {str_replace_all(x, "[^0-9]", "") %>% as.numeric()}) %>% 
    mutate(Year = pop_df$Year, Country = country_name[1], Age = pop_df$Age) %>% 
    select(Year, Country, Age, everything()) %>% 
    mutate(Percent_Both_Sexes = Both_Sexes_Population / Both_Sexes_Population[1], 
           Percent_Male = Male_Population / Male_Population[1], 
           Percent_Female = Female_Population / Female_Population[1], 
           Sex_Ratio = Male_Population / Female_Population, 
           Age = case_when(Age == "0-4" ~ "00-04", Age == "5-9" ~ "05-09", TRUE ~ Age))
  
  return(final_df)
  
}



vn_2018_pop <- get_population("VM", 2018)

#======================
#     Make  Graph
#======================


# Colors selected: 
my_colors <- c("#2E74C0", "#CB454A")
my_font <- "Roboto Condensed"


vn_2018_pop %>% 
  slice(-c(1, 21:22)) %>% 
  select(Age, Male_Population, Female_Population) %>% 
  mutate(Male_Population = -1*Male_Population) %>% 
  gather(Gender, Value, -Age) %>% 
  ggplot(aes(Age, Value, fill = Gender)) + 
  geom_col(position = "stack") + 
  coord_flip() + 
  scale_y_continuous(breaks = seq(-5000000, 5000000, 1000000), 
                     limits = c(-5000000, 5000000), 
                     labels = c(paste0(seq(5, 0, -1), "M"), paste0(1:5, "M"))) + 
  theme_minimal() + 
  scale_fill_manual(values = my_colors, name = "", labels = c("Female", "Male")) + 
  guides(fill = guide_legend(reverse = TRUE)) + 
  theme(panel.grid.major.x = element_line(linetype = "dotted", size = 0.2, color = "grey40")) + 
  theme(panel.grid.major.y = element_blank()) + 
  theme(panel.grid.minor.y = element_blank()) + 
  theme(panel.grid.minor.x = element_blank()) + 
  theme(legend.position = "top") + 
  theme(plot.title = element_text(family = my_font, size = 28)) + 
  theme(plot.subtitle = element_text(family = my_font, size = 13, color = "gray40")) + 
  theme(plot.caption = element_text(family = my_font, size = 12, colour = "grey40", face = "italic")) + 
  theme(plot.margin = unit(c(1.2, 1.2, 1.2, 1.2), "cm")) + 
  theme(axis.text = element_text(size = 13, family = my_font)) + 
  theme(legend.text = element_text(size = 12, face = "bold", color = "grey30", family = my_font)) + 
  labs(x = NULL, y = NULL, 
       title = "Population Pyramids of Vietnam in 2018",
       subtitle = "A population pyramid illustrates the age-sex structure of a country's population and may provide insights about\npolitical and social stability, as well as economic development. Countries with young populations need to\ninvest more in schools, while countries with older populations need to invest more in the health sector.",
       caption = "Data Source: https://www.census.gov")
LS0tDQp0aXRsZTogIlBvcHVsYXRpb24gUHlyYW1pZCBHcmFwaCBmb3IgVmlldG5hbSBpbiAyMDE4Ig0KYXV0aG9yOiAiTmd1eWVuIENoaSBEdW5nIg0Kc3VidGl0bGU6ICJEYWlseSBHcmFwaCBTZXJpZXMiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgIyBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5yZXRpbmE9MikNCmBgYA0KDQojIERhdGEgU291cmNlIGFuZCBEZXNjcmlwdGlvbg0KDQpJbiB0aGlzIHBvc3QgSSB3aWxsIHByZXNlbnQgUiBjb2RlcyBmb3IgY29sbGVjdGluZyBwb3B1bGF0aW9uIGRhdGEgcHJvdmlkZWQgYnkgVS5TLiBDZW5zdXMgQnVyZWF1IHdpdGggaW5wdXRzIGFyZSBnaXZlbiBjb3VudHJ5IGNvZGUgYW5kIHllYXIgc2VsZWN0ZWQuIEluIGFkZGl0aW9uLCBSIGNvZGVzIGZvciBtYWtpbmcgUG9wdWxhdGlvbiBQeXJhbWlkcyBmb3IgVmlldG5hbSBpbiAyMDE4IGFyZSBzaG93bi4NCg0KIyBQb3B1bGF0aW9uIFB5cmFtaWQgR3JhcGgNCg0KDQohW10oQzpcVXNlcnNcWmJvb2tcRGVza3RvcFxwaWNccGljMjAucG5nKQ0KDQpSIGNvZGVzIGZvciB0aGlzIGdyYXBoOiANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCg0KDQoNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojICAgU2NyYXBwaW5nIHBvcHVsYXRpb24gZGF0YSB3aXRoIGlucHV0cyBhcmU6IA0KIyAgIDEuIEdpdmVuIHllYXIsIA0KIyAgIDIuIENvdW50cnkgY29kZSBzZWxlY3RlZCBmcm9tIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT18zMTY2LTFfYWxwaGEtMg0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIyBDbGVhciB3b3Jrc3BhY2U6IA0Kcm0obGlzdCA9IGxzKCkpDQoNCiMgTG9hZCBzb21lIHBhY2thZ2VzIGZvciBzY3JhcHBpbmcgZGF0YSBhbmQgZGF0YSBtYW5pcHVsYXRpb246IA0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZXh0cmFmb250KQ0KDQojIEEgZnVuY3Rpb24gZm9yIGNvbGxlY3RpbmcgcG9wdWxhdGlvbiBkYXRhOiANCg0KZ2V0X3BvcHVsYXRpb24gPC0gZnVuY3Rpb24oY291bnRyeUNvZGVfc2VsZWN0ZWQsIHllYXJfc2VsZWN0ZWQpIHsNCiAgDQogIGJhc2VfdXJsIDwtICJodHRwczovL3d3dy5jZW5zdXMuZ292L2RhdGEtdG9vbHMvZGVtby9pZGIvcmVnaW9uLnBocD9OPSUyMFJlc3VsdHMlMjAmVD0xMCZBPXNlcGFyYXRlJlJUPTAmWT0iDQogIGxpbmsgPC0gcGFzdGUwKHBhc3RlMChwYXN0ZTAoYmFzZV91cmwsIHllYXJfc2VsZWN0ZWQpLCAiJlI9LTEmQz0iKSwgY291bnRyeUNvZGVfc2VsZWN0ZWQpDQogIA0KICBsaW5rICU+JSANCiAgICByZWFkX2h0bWwoKSAtPiBodG1sX2NvbnRlbnQgIA0KICANCiAgaHRtbF9jb250ZW50ICU+JSANCiAgICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKSAlPiUgDQogICAgLltbMV1dIC0+IHBvcF9kZg0KICANCiAgbmFtZXMocG9wX2RmKSA8LSBzdHJfcmVwbGFjZV9hbGwobmFtZXMocG9wX2RmKSwgIiAiLCAiXyIpDQogIA0KICBjb3VudHJ5X25hbWUgPC0gaHRtbF9jb250ZW50ICU+JSANCiAgICBodG1sX25vZGVzKCcucXVlcnlfc291cmNlIGEnKSAlPiUgDQogICAgaHRtbF90ZXh0KCkgDQogIA0KICBpZiAobGVuZ3RoKGNvdW50cnlfbmFtZSkgPT0gMikgew0KICAgIGNvdW50cnlfbmFtZSA8LSBjb3VudHJ5X25hbWVbMl0NCiAgfQ0KICANCiAgDQogIGZpbmFsX2RmIDwtIHBvcF9kZiAlPiUgDQogICAgc2VsZWN0KC1ZZWFyLCAtQWdlLCAtY29udGFpbnMoIlBlcmNlbnQiKSwgLVNleF9SYXRpbykgJT4lIA0KICAgIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3N0cl9yZXBsYWNlX2FsbCh4LCAiW14wLTldIiwgIiIpICU+JSBhcy5udW1lcmljKCl9KSAlPiUgDQogICAgbXV0YXRlKFllYXIgPSBwb3BfZGYkWWVhciwgQ291bnRyeSA9IGNvdW50cnlfbmFtZVsxXSwgQWdlID0gcG9wX2RmJEFnZSkgJT4lIA0KICAgIHNlbGVjdChZZWFyLCBDb3VudHJ5LCBBZ2UsIGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICAgIG11dGF0ZShQZXJjZW50X0JvdGhfU2V4ZXMgPSBCb3RoX1NleGVzX1BvcHVsYXRpb24gLyBCb3RoX1NleGVzX1BvcHVsYXRpb25bMV0sIA0KICAgICAgICAgICBQZXJjZW50X01hbGUgPSBNYWxlX1BvcHVsYXRpb24gLyBNYWxlX1BvcHVsYXRpb25bMV0sIA0KICAgICAgICAgICBQZXJjZW50X0ZlbWFsZSA9IEZlbWFsZV9Qb3B1bGF0aW9uIC8gRmVtYWxlX1BvcHVsYXRpb25bMV0sIA0KICAgICAgICAgICBTZXhfUmF0aW8gPSBNYWxlX1BvcHVsYXRpb24gLyBGZW1hbGVfUG9wdWxhdGlvbiwgDQogICAgICAgICAgIEFnZSA9IGNhc2Vfd2hlbihBZ2UgPT0gIjAtNCIgfiAiMDAtMDQiLCBBZ2UgPT0gIjUtOSIgfiAiMDUtMDkiLCBUUlVFIH4gQWdlKSkNCiAgDQogIHJldHVybihmaW5hbF9kZikNCiAgDQp9DQoNCg0KDQp2bl8yMDE4X3BvcCA8LSBnZXRfcG9wdWxhdGlvbigiVk0iLCAyMDE4KQ0KDQojPT09PT09PT09PT09PT09PT09PT09PQ0KIyAgICAgTWFrZSAgR3JhcGgNCiM9PT09PT09PT09PT09PT09PT09PT09DQoNCg0KIyBDb2xvcnMgc2VsZWN0ZWQ6IA0KbXlfY29sb3JzIDwtIGMoIiMyRTc0QzAiLCAiI0NCNDU0QSIpDQpteV9mb250IDwtICJSb2JvdG8gQ29uZGVuc2VkIg0KDQoNCnZuXzIwMThfcG9wICU+JSANCiAgc2xpY2UoLWMoMSwgMjE6MjIpKSAlPiUgDQogIHNlbGVjdChBZ2UsIE1hbGVfUG9wdWxhdGlvbiwgRmVtYWxlX1BvcHVsYXRpb24pICU+JSANCiAgbXV0YXRlKE1hbGVfUG9wdWxhdGlvbiA9IC0xKk1hbGVfUG9wdWxhdGlvbikgJT4lIA0KICBnYXRoZXIoR2VuZGVyLCBWYWx1ZSwgLUFnZSkgJT4lIA0KICBnZ3Bsb3QoYWVzKEFnZSwgVmFsdWUsIGZpbGwgPSBHZW5kZXIpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIpICsgDQogIGNvb3JkX2ZsaXAoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC01MDAwMDAwLCA1MDAwMDAwLCAxMDAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01MDAwMDAwLCA1MDAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKHBhc3RlMChzZXEoNSwgMCwgLTEpLCAiTSIpLCBwYXN0ZTAoMTo1LCAiTSIpKSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG15X2NvbG9ycywgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArIA0KICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsgDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBzaXplID0gMC4yLCBjb2xvciA9ICJncmV5NDAiKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDI4KSkgKyANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTMsIGNvbG9yID0gImdyYXk0MCIpKSArIA0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDEyLCBjb2xvdXIgPSAiZ3JleTQwIiwgZmFjZSA9ICJpdGFsaWMiKSkgKyANCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMS4yLCAxLjIsIDEuMiwgMS4yKSwgImNtIikpICsgDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIGZhbWlseSA9IG15X2ZvbnQpKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gImdyZXkzMCIsIGZhbWlseSA9IG15X2ZvbnQpKSArIA0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgDQogICAgICAgdGl0bGUgPSAiUG9wdWxhdGlvbiBQeXJhbWlkcyBvZiBWaWV0bmFtIGluIDIwMTgiLA0KICAgICAgIHN1YnRpdGxlID0gIkEgcG9wdWxhdGlvbiBweXJhbWlkIGlsbHVzdHJhdGVzIHRoZSBhZ2Utc2V4IHN0cnVjdHVyZSBvZiBhIGNvdW50cnkncyBwb3B1bGF0aW9uIGFuZCBtYXkgcHJvdmlkZSBpbnNpZ2h0cyBhYm91dFxucG9saXRpY2FsIGFuZCBzb2NpYWwgc3RhYmlsaXR5LCBhcyB3ZWxsIGFzIGVjb25vbWljIGRldmVsb3BtZW50LiBDb3VudHJpZXMgd2l0aCB5b3VuZyBwb3B1bGF0aW9ucyBuZWVkIHRvXG5pbnZlc3QgbW9yZSBpbiBzY2hvb2xzLCB3aGlsZSBjb3VudHJpZXMgd2l0aCBvbGRlciBwb3B1bGF0aW9ucyBuZWVkIHRvIGludmVzdCBtb3JlIGluIHRoZSBoZWFsdGggc2VjdG9yLiIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdiIpDQoNCg0KDQpgYGANCg0K