# Download data from https://ctt.hust.edu.vn/DisplayWeb/DisplayBaiViet?baiviet=41346&fbclid=IwAR3nemyk6PQhK36NCTIAvs1KwdXO3B1s0ZelOz8IdlwHo5U4Y3S35ZbzhZ0
library(pdftools)
library(tidyverse)
txt <- pdf_text("DS SV được HB KKHT đăng web.pdf") %>% readr::read_lines()
txt[-c(1:6)] -> hocbong
hocbong %>%
str_split(pattern = " +", simplify = TRUE) %>%
as.data.frame() -> df_hocbong
names(df_hocbong) <- c("code", "field", "department", "khoa", "gpa", "rl", "type")
df_hocbong %>% mutate(khoa = str_c("K", khoa),
gpa = as.numeric(gpa),
rl = as.numeric(rl)) -> df_hocbong
df_hocbong %>% mutate(department = case_when(department == "Trường Công nghệ thông tin và Truyền thông" ~ "Trường CNTT-TT",
department == "Viện Toán ứng dụng và Tin học" ~ "Viện Toán - Tin",
department == "Viện Dệt may, Da giầy và thời trang" ~ "Viện Dệt May - TT",
TRUE ~ department)) -> df_hocbong
df_hocbong %>%
filter(department != "") %>%
group_by(department, type) %>%
count() -> nhomhocbong_byKhoa
nhomhocbong_byKhoa %>%
group_by(department) %>%
mutate(rateA = case_when(type == "A" ~ n / sum(n))) %>%
filter(!is.na(rateA)) -> df_rateA
df_rateA %>%
arrange(rateA) %>%
pull(department) -> department_orderedA
nhomhocbong_byKhoa %>%
mutate(type = factor(type, levels = c("C", "B", "A"))) %>%
mutate(department = factor(department, levels = department_orderedA)) -> nhomhocbong_byKhoa
nhomhocbong_byKhoa %>% filter(type == "A") -> hocbongloaiA
nhomhocbong_byKhoa %>% filter(type == "C") -> hocbongloaiC
nhomhocbong_byKhoa %>%
group_by(department) %>%
mutate(rateB = case_when(type == "B" ~ n / sum(n))) %>%
filter(!is.na(rateB)) -> df_rateB
full_join(df_rateA, df_rateB %>% select(-type), by = "department") -> df_rateAB
df_rateAB %>%
mutate(x_pos = rateA + 0.5*rateB) -> df_positionB
my_font <- "Roboto Condensed"
library(showtext)
font_add_google(name = my_font, family = my_font)
showtext_auto()
my_cols <- c('#1b9e77','#d95f02','#7570b3')
nhomhocbong_byKhoa %>%
ggplot(aes(y = department, x = n, fill = type)) +
geom_col(position = "fill") +
scale_fill_manual(values = my_cols) +
theme(legend.position = "top") +
theme(text = element_text(family = my_font)) +
theme(axis.title = element_blank()) +
guides(fill = guide_legend(reverse = TRUE, title = "Loại học bổng")) +
labs(title = "Số lượng và tỉ lệ các loại học bổng - học kì 2 năm học 2022-2023",
subtitle = "Có tất cả 1621 sinh viên được học bổng. Viện CNTT-TT có 193 sinh viên đạt học bổng loại A (77%),\nViện KH&CN Môi trường có tỉ lệ sinh viên đạt học bổng loại A là thấp nhất với 24%.",
caption = "Source: https://ctt.hust.edu.vn | Graphic: Nguyen Chi Dung") +
geom_text(data = hocbongloaiA, aes(x = 0.015, label = n), hjust = 0, color = "white", family = my_font, size = 5) +
geom_text(data = hocbongloaiC %>% filter(department != "Viện Ngoại ngữ"), aes(x = 0.985, label = n), hjust = 1, color = "white", family = my_font, size = 5) +
geom_text(data = df_positionB, aes(x = x_pos, label = n.y), hjust = 1, color = "white", family = my_font, size = 5) +
theme(axis.ticks = element_blank()) +
scale_x_continuous(expand = c(0, 0), labels = c("0%", "25%", "50%", "75%", "100%")) +
theme(legend.key.height = unit(0.35, "cm")) +
theme(legend.key.width = unit(0.35, "cm")) +
theme(plot.title.position = "plot") +
theme(plot.title = element_text(size = 20)) +
theme(plot.subtitle = element_text(size = 11, color = "grey20")) +
theme(plot.caption = element_text(size = 10, color = "grey40")) +
theme(plot.margin = margin(0.5, 1, 0.5, 0.5, "cm")) +
theme(axis.text.y = element_text(size = 11)) +
theme(axis.text.x = element_text(size = 12)) +
theme(legend.text = element_text(color = "grey30", family = my_font)) +
theme(legend.title = element_text(color = "grey30", family = my_font)) +
theme(panel.grid.minor = element_blank()) +
theme(panel.grid.major.x = element_line(color = "grey60", size = 0.8))