R Codes

#===========================
#  Pepare data for ploting
#===========================


# Import Data:  

rm(list = ls())

library(readstata13)

read.dta13("ipumsi_00002.dta") -> ipumsi_raw # The dataset of 2368167 observations and 92 columns. 

# Prepare data for ploting: 

library(tidyverse)

ipumsi_raw %>% 
  mutate_if(is.factor, function(x) {as.character(x)}) %>% 
  mutate(vn1999a_age = str_replace_all(vn1999a_age, "\\+", "")) %>% 
  mutate(age_num = as.numeric(vn1999a_age)) -> ipumsi

# Age group (reference: https://rpubs.com/chidungkt/505486): 

age_grouped <- c("00-04", "05-09", str_c(seq(10, 85, 5), seq(14, 89, 5), sep = "-"), "90+")

ipumsi %>% 
  mutate(age_group = case_when(age_num <= 4 ~ age_grouped[1], 
                               age_num >= 5 & age_num <= 9 ~ age_grouped[2], 
                               age_num >= 10 & age_num <= 14 ~ age_grouped[3], 
                               age_num >= 15 & age_num <= 19 ~ age_grouped[4], 
                               age_num >= 20 & age_num <= 24 ~ age_grouped[5], 
                               age_num >= 25 & age_num <= 29 ~ age_grouped[6], 
                               age_num >= 30 & age_num <= 34 ~ age_grouped[7], 
                               age_num >= 35 & age_num <= 39 ~ age_grouped[8], 
                               age_num >= 40 & age_num <= 44 ~ age_grouped[9], 
                               age_num >= 45 & age_num <= 49 ~ age_grouped[10], 
                               age_num >= 50 & age_num <= 54 ~ age_grouped[11], 
                               age_num >= 55 & age_num <= 59 ~ age_grouped[12], 
                               age_num >= 60 & age_num <= 64 ~ age_grouped[13], 
                               age_num >= 65 & age_num <= 69 ~ age_grouped[14], 
                               age_num >= 70 & age_num <= 74 ~ age_grouped[15], 
                               age_num >= 75 & age_num <= 79 ~ age_grouped[16], 
                               age_num >= 80 & age_num <= 84 ~ age_grouped[17], 
                               age_num >= 85 & age_num <= 89 ~ age_grouped[18], 
                               age_num >= 90 ~ age_grouped[19])) -> ipumsi

ipumsi %>% 
  group_by(vn1999a_sex, age_group) %>% 
  count() %>% 
  ungroup() %>% 
  mutate(age_group = factor(age_group, levels = age_grouped)) %>% 
  mutate(n = case_when(vn1999a_sex == "female" ~ -n, TRUE ~ n)) -> df_age_group


#======================
#  Data Visualization
#======================

# Colors selected: 

my_colors <- c("#3E606F", "#8C3F4D")

library(showtext) # Reference: https://rpubs.com/chidungkt/744221
font_add_google(name = "Roboto Condensed", family = "roboto") # Font selected for graph. 
my_font <- "roboto"
showtext_auto()

# Label on x axis: 

label_x <- c(paste0(seq(150, 0, -50), "K"), paste0(seq(50, 150, 50), "K"))

# Make a draft: 

df_age_group %>% 
  ggplot(aes(age_group, n, fill = vn1999a_sex)) + 
  geom_col() + 
  coord_flip() + 
  scale_y_continuous(breaks = seq(-150000, 150000, 50000), limits = c(-150000, 150000), labels = label_x) +
  theme_minimal() + 
  scale_fill_manual(values = my_colors, name = "", labels = c("Female", "Male")) + 
  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 = 20)) + 
  theme(plot.subtitle = element_text(family = my_font, size = 12, color = "gray30")) + 
  theme(plot.caption = element_text(family = my_font, size = 9, colour = "grey30", face = "italic")) + 
  theme(plot.margin = unit(c(1.2, 1.2, 1.2, 1.2), "cm")) + 
  theme(axis.text = element_text(size = 11, family = my_font)) + 
  theme(legend.text = element_text(size = 10, face = "bold", color = "grey30", family = my_font)) + 
  labs(x = NULL, y = NULL, 
       title = "An Approximation of Population Pyramids of Vietnam in 1999",
       subtitle = "A population pyramid illustrates the age-sex structure of a country's population and may\nprovide insights about political and social stability, as well as economic development.",
       caption = "Data Source: Minnesota Population Center")
LS0tDQp0aXRsZTogIlBvcHVsYXRpb24gUHlyYW1pZHMgb2YgVmlldG5hbSBpbiAxOTk5IChNaW5uZXNvdGEgUG9wdWxhdGlvbiBDZW50ZXIpIg0KYXV0aG9yOiAnQXV0aG9yOiBOZ3V5ZW4gQ2hpIER1bmcnDQpzdWJ0aXRsZTogRGFpbHkgR3JhcGggU2VyaWVzDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgY2FjaGUgPSBUUlVFKQ0KDQpgYGANCg0KDQohW10oQzpcXFVzZXJzXFxBZG1pblxcRG9jdW1lbnRzXFxwb3AxOTk5LmpwZykNCg0KDQojIFIgQ29kZXMgDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgIFBlcGFyZSBkYXRhIGZvciBwbG90aW5nDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KIyBJbXBvcnQgRGF0YTogIA0KDQpybShsaXN0ID0gbHMoKSkNCg0KbGlicmFyeShyZWFkc3RhdGExMykNCg0KcmVhZC5kdGExMygiaXB1bXNpXzAwMDAyLmR0YSIpIC0+IGlwdW1zaV9yYXcgIyBUaGUgZGF0YXNldCBvZiAyMzY4MTY3IG9ic2VydmF0aW9ucyBhbmQgOTIgY29sdW1ucy4gDQoNCiMgUHJlcGFyZSBkYXRhIGZvciBwbG90aW5nOiANCg0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCmlwdW1zaV9yYXcgJT4lIA0KICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBmdW5jdGlvbih4KSB7YXMuY2hhcmFjdGVyKHgpfSkgJT4lIA0KICBtdXRhdGUodm4xOTk5YV9hZ2UgPSBzdHJfcmVwbGFjZV9hbGwodm4xOTk5YV9hZ2UsICJcXCsiLCAiIikpICU+JSANCiAgbXV0YXRlKGFnZV9udW0gPSBhcy5udW1lcmljKHZuMTk5OWFfYWdlKSkgLT4gaXB1bXNpDQoNCiMgQWdlIGdyb3VwIChyZWZlcmVuY2U6IGh0dHBzOi8vcnB1YnMuY29tL2NoaWR1bmdrdC81MDU0ODYpOiANCg0KYWdlX2dyb3VwZWQgPC0gYygiMDAtMDQiLCAiMDUtMDkiLCBzdHJfYyhzZXEoMTAsIDg1LCA1KSwgc2VxKDE0LCA4OSwgNSksIHNlcCA9ICItIiksICI5MCsiKQ0KDQppcHVtc2kgJT4lIA0KICBtdXRhdGUoYWdlX2dyb3VwID0gY2FzZV93aGVuKGFnZV9udW0gPD0gNCB+IGFnZV9ncm91cGVkWzFdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbnVtID49IDUgJiBhZ2VfbnVtIDw9IDkgfiBhZ2VfZ3JvdXBlZFsyXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSAxMCAmIGFnZV9udW0gPD0gMTQgfiBhZ2VfZ3JvdXBlZFszXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSAxNSAmIGFnZV9udW0gPD0gMTkgfiBhZ2VfZ3JvdXBlZFs0XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSAyMCAmIGFnZV9udW0gPD0gMjQgfiBhZ2VfZ3JvdXBlZFs1XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSAyNSAmIGFnZV9udW0gPD0gMjkgfiBhZ2VfZ3JvdXBlZFs2XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSAzMCAmIGFnZV9udW0gPD0gMzQgfiBhZ2VfZ3JvdXBlZFs3XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSAzNSAmIGFnZV9udW0gPD0gMzkgfiBhZ2VfZ3JvdXBlZFs4XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSA0MCAmIGFnZV9udW0gPD0gNDQgfiBhZ2VfZ3JvdXBlZFs5XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSA0NSAmIGFnZV9udW0gPD0gNDkgfiBhZ2VfZ3JvdXBlZFsxMF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9udW0gPj0gNTAgJiBhZ2VfbnVtIDw9IDU0IH4gYWdlX2dyb3VwZWRbMTFdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbnVtID49IDU1ICYgYWdlX251bSA8PSA1OSB+IGFnZV9ncm91cGVkWzEyXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSA2MCAmIGFnZV9udW0gPD0gNjQgfiBhZ2VfZ3JvdXBlZFsxM10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9udW0gPj0gNjUgJiBhZ2VfbnVtIDw9IDY5IH4gYWdlX2dyb3VwZWRbMTRdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbnVtID49IDcwICYgYWdlX251bSA8PSA3NCB+IGFnZV9ncm91cGVkWzE1XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSA3NSAmIGFnZV9udW0gPD0gNzkgfiBhZ2VfZ3JvdXBlZFsxNl0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9udW0gPj0gODAgJiBhZ2VfbnVtIDw9IDg0IH4gYWdlX2dyb3VwZWRbMTddLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbnVtID49IDg1ICYgYWdlX251bSA8PSA4OSB+IGFnZV9ncm91cGVkWzE4XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX251bSA+PSA5MCB+IGFnZV9ncm91cGVkWzE5XSkpIC0+IGlwdW1zaQ0KDQppcHVtc2kgJT4lIA0KICBncm91cF9ieSh2bjE5OTlhX3NleCwgYWdlX2dyb3VwKSAlPiUgDQogIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCwgbGV2ZWxzID0gYWdlX2dyb3VwZWQpKSAlPiUgDQogIG11dGF0ZShuID0gY2FzZV93aGVuKHZuMTk5OWFfc2V4ID09ICJmZW1hbGUiIH4gLW4sIFRSVUUgfiBuKSkgLT4gZGZfYWdlX2dyb3VwDQoNCg0KIz09PT09PT09PT09PT09PT09PT09PT0NCiMgIERhdGEgVmlzdWFsaXphdGlvbg0KIz09PT09PT09PT09PT09PT09PT09PT0NCg0KIyBDb2xvcnMgc2VsZWN0ZWQ6IA0KDQpteV9jb2xvcnMgPC0gYygiIzNFNjA2RiIsICIjOEMzRjREIikNCg0KbGlicmFyeShzaG93dGV4dCkgIyBSZWZlcmVuY2U6IGh0dHBzOi8vcnB1YnMuY29tL2NoaWR1bmdrdC83NDQyMjENCmZvbnRfYWRkX2dvb2dsZShuYW1lID0gIlJvYm90byBDb25kZW5zZWQiLCBmYW1pbHkgPSAicm9ib3RvIikgIyBGb250IHNlbGVjdGVkIGZvciBncmFwaC4gDQpteV9mb250IDwtICJyb2JvdG8iDQpzaG93dGV4dF9hdXRvKCkNCg0KIyBMYWJlbCBvbiB4IGF4aXM6IA0KDQpsYWJlbF94IDwtIGMocGFzdGUwKHNlcSgxNTAsIDAsIC01MCksICJLIiksIHBhc3RlMChzZXEoNTAsIDE1MCwgNTApLCAiSyIpKQ0KDQojIE1ha2UgYSBkcmFmdDogDQoNCmRmX2FnZV9ncm91cCAlPiUgDQogIGdncGxvdChhZXMoYWdlX2dyb3VwLCBuLCBmaWxsID0gdm4xOTk5YV9zZXgpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGNvb3JkX2ZsaXAoKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xNTAwMDAsIDE1MDAwMCwgNTAwMDApLCBsaW1pdHMgPSBjKC0xNTAwMDAsIDE1MDAwMCksIGxhYmVscyA9IGxhYmVsX3gpICsNCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG15X2NvbG9ycywgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJGZW1hbGUiLCAiTWFsZSIpKSArIA0KICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgc2l6ZSA9IDAuMiwgY29sb3IgPSAiZ3JleTQwIikpICsgDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAyMCkpICsgDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDEyLCBjb2xvciA9ICJncmF5MzAiKSkgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSA5LCBjb2xvdXIgPSAiZ3JleTMwIiwgZmFjZSA9ICJpdGFsaWMiKSkgKyANCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMS4yLCAxLjIsIDEuMiwgMS4yKSwgImNtIikpICsgDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGZhbWlseSA9IG15X2ZvbnQpKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gImdyZXkzMCIsIGZhbWlseSA9IG15X2ZvbnQpKSArIA0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgDQogICAgICAgdGl0bGUgPSAiQW4gQXBwcm94aW1hdGlvbiBvZiBQb3B1bGF0aW9uIFB5cmFtaWRzIG9mIFZpZXRuYW0gaW4gMTk5OSIsDQogICAgICAgc3VidGl0bGUgPSAiQSBwb3B1bGF0aW9uIHB5cmFtaWQgaWxsdXN0cmF0ZXMgdGhlIGFnZS1zZXggc3RydWN0dXJlIG9mIGEgY291bnRyeSdzIHBvcHVsYXRpb24gYW5kIG1heVxucHJvdmlkZSBpbnNpZ2h0cyBhYm91dCBwb2xpdGljYWwgYW5kIHNvY2lhbCBzdGFiaWxpdHksIGFzIHdlbGwgYXMgZWNvbm9taWMgZGV2ZWxvcG1lbnQuIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBNaW5uZXNvdGEgUG9wdWxhdGlvbiBDZW50ZXIiKQ0KDQoNCg0KYGBgDQoNCg==