加载R包

library(tidyverse)
library(remotes)
# remotes::install_local("bstfun-main.zip",upgrade = F,dependencies = T)
library(bstfun)
library(gt)
library(gtExtras)
library(MetBrewer)
sessionInfo()
## R version 4.4.0 (2024-04-24)
## Platform: aarch64-apple-darwin20
## Running under: macOS Sonoma 14.5
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## time zone: Asia/Shanghai
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] MetBrewer_0.2.0   gtExtras_0.5.0    gt_0.10.1.9000    bstfun_0.5.1.9002
##  [5] remotes_2.5.0     lubridate_1.9.3   forcats_1.0.0     stringr_1.5.1    
##  [9] dplyr_1.1.4       purrr_1.0.2       readr_2.1.5       tidyr_1.3.1      
## [13] tibble_3.2.1      ggplot2_3.5.1     tidyverse_2.0.0  
## 
## loaded via a namespace (and not attached):
##  [1] sass_0.4.9           utf8_1.2.4           generics_0.1.3      
##  [4] prettydoc_0.4.1      gtsummary_1.7.2      xml2_1.3.6          
##  [7] stringi_1.8.4        hms_1.1.3            digest_0.6.35       
## [10] magrittr_2.0.3       evaluate_0.24.0      grid_4.4.0          
## [13] timechange_0.3.0     fastmap_1.2.0        rprojroot_2.0.4     
## [16] broom.helpers_1.15.0 jsonlite_1.8.8       rematch2_2.1.2      
## [19] fansi_1.0.6          scales_1.3.0         jquerylib_0.1.4     
## [22] cli_3.6.3            rlang_1.1.4          munsell_0.5.1       
## [25] withr_3.0.0          cachem_1.1.0         yaml_2.3.8          
## [28] tools_4.4.0          tzdb_0.4.0           colorspace_2.1-0    
## [31] here_1.0.1           paletteer_1.6.0      vctrs_0.6.5         
## [34] R6_2.5.1             lifecycle_1.0.4      fontawesome_0.5.2   
## [37] pkgconfig_2.0.3      pillar_1.9.0         bslib_0.7.0         
## [40] gtable_0.3.5         glue_1.7.0           xfun_0.44           
## [43] tidyselect_1.2.1     highr_0.11           rstudioapi_0.16.0   
## [46] knitr_1.47           htmltools_0.5.8.1    rmarkdown_2.27      
## [49] compiler_4.4.0

注:bstfun在线安装比较困难,因此使用本地安装的方法压缩文件内会有编译好的R安装包

数据清洗

# 定义表格的颜色调色板
gt_palette <- scales::col_numeric(c("#004714","#35669D","#93A198","#FEF2F2"), # 定义颜色范围
                                  domain = NULL, alpha = 0.75) # 设置颜色透明度

# 从.tsv文件读取数据集并进行过滤
df <- read_tsv("GBD_ASDR_Male.xls") %>%  # 读取.tsv文件
  filter(location=="Global", # 过滤全球数据
         age %in% c("<5 years","5-9 years","10-14 years","15-19 years", # 选择特定年龄组
                    "20-24 years","25-29 years","30-34 years","35-39 years",
                    "40-44 years","45-49 years","50-54 years","55-59 years",
                    "60-64 years","65-69 years","70-74 years","75-79 years",
                    "80-84 years","85-89 years","90-94 years","95+ years")) %>% 
  mutate(val=round(val,digits = 2)) %>%  # 将值四舍五入到小数点后两位
  select(year, val, age) # 选择表格的相关列

# 创建1990年的表格
year_1990 <- df %>% 
  filter(year=="1990") %>% select(-year) %>%  # 过滤1990年的数据并移除'year'列
  select(2,1) %>%  # 重新排列列顺序,将'age'放在前,'val'放在后
  gt() %>%  # 创建gt表格对象
  cols_label(val = "") %>%  # 自定义列标签
  tab_style(locations = cells_column_labels(columns = everything()), # 设置列标签样式
            style= list(cell_borders(sides = "bottom", 
                                     weight = px(3)), # 设置底部边框粗细
                        cell_text(weight = "bold"))) %>%  # 设置文本为粗体
  tab_style(locations = cells_title(groups = "title"), # 设置表格标题样式
            style = list(cell_text(weight = "bold", # 设置文本为粗体
                                   size = 24))) %>%  # 设置字体大小
  data_color(columns = c(val), colors = gt_palette) %>%  # 将调色板应用于'val'列
  cols_align(align = "left", columns = c(val)) %>%  # 设置'val'列文本左对齐
  cols_align(align = "center", columns = c(age)) %>%  # 设置'age'列文本居中对齐
  cols_width(c(age) ~ px(145), c(val) ~ px(70)) %>%  # 设置列宽
  tab_options(
    column_labels.border.top.width = px(3), # 设置列标签顶部边框宽度
    column_labels.border.top.color = "transparent", # 设置列标签顶部边框颜色为透明
    table.border.top.color = "transparent", # 设置表格顶部边框颜色为透明
    table.border.bottom.color = "transparent", # 设置表格底部边框颜色为透明
    data_row.padding = px(10), # 设置数据行填充
    source_notes.font.size = 12, # 设置来源注释字体大小
    heading.align = "left") # 设置标题左对齐

# 创建2019年的表格
year_2019 <- df %>% 
  filter(year=="2019") %>% select(-year) %>%  # 过滤2019年的数据并移除'year'列
  gt() %>%  # 创建gt表格对象
  cols_label(val = "") %>%  # 自定义列标签
  tab_style(locations = cells_column_labels(columns = everything()), # 设置列标签样式
            style= list(cell_borders(sides = "bottom", 
                                     weight = px(3)), # 设置底部边框粗细
                        cell_text(weight = "bold"))) %>%  # 设置文本为粗体
  tab_style(locations = cells_title(groups = "title"), # 设置表格标题样式
            style = list(cell_text(weight = "bold", # 设置文本为粗体
                                   size = 24))) %>%  # 设置字体大小
  data_color(columns = c(val), colors = gt_palette) %>%  # 将调色板应用于'val'列
  cols_align(align = "left", columns = c(val)) %>%  # 设置'val'列文本左对齐
  cols_align(align = "center", columns = c(age)) %>%  # 设置'age'列文本居中对齐
  cols_width(c(age) ~ px(145), c(val) ~ px(70)) %>%  # 设置列宽
  tab_options(
    column_labels.border.top.width = px(3), # 设置列标签顶部边框宽度
    column_labels.border.top.color = "transparent", # 设置列标签顶部边框颜色为透明
    table.border.top.color = "transparent", # 设置表格顶部边框颜色为透明
    table.border.bottom.color = "transparent", # 设置表格底部边框颜色为透明
    data_row.padding = px(10), # 设置数据行填充
    source_notes.font.size = 12, # 设置来源注释字体大小
    heading.align = "left") # 设置标题左对齐

绘制中部折线

df$age <- factor(df$age,levels = df$age %>% unique())

# 按年龄组分组数据并计算每个年龄组的全球死亡率列表
lines <- df %>% 
  group_by(age) %>%  # 按年龄组分组
  dplyr::summarize(`Global Mortality Rates by Age Group (1990-2019)` = list(val), .groups = "drop") %>%  # 汇总每个年龄组的死亡率,并将其转换为列表
  select(2) %>%  # 选择第二列,即全球死亡率
  gt() %>%  # 创建gt表格对象
  gt_plt_sparkline("Global Mortality Rates by Age Group (1990-2019)", # 为每个年龄组添加火花线图
                   label=F, same_limit=F, type="points", # 不显示标签,不使用相同的限制,类型为点
                   fig_dim = c(20,150), # 设置图形尺寸
                   palette = paste(met.brewer("VanGogh1", n=5, type="continuous"))) %>%  # 设置调色板
  tab_options(
    column_labels.border.top.width = px(20), # 设置列标签顶部边框宽度
    column_labels.border.top.color = "transparent", # 设置列标签顶部边框颜色为透明
    table.border.top.color = "transparent", # 设置表格顶部边框颜色为透明
    table.border.bottom.color = "transparent", # 设置表格底部边框颜色为透明
    row.striping.include_table_body = FALSE, # 禁用条纹行
    table_body.hlines.width = px(0),  # 移除表格主体部分的横线
    table_body.vlines.width = px(0),  # 移除表格主体部分的竖线
    heading.border.bottom.width = px(0), # 设置标题底部边框宽度
    data_row.padding = px(-10), # 设置数据行填充
    source_notes.font.size = 30, # 设置来源注释字体大小
    heading.align = "left") %>%  # 设置标题左对齐
  tab_style(
    style = cell_text(size = px(32)),  # 设置字体大小
    locations = cells_column_labels(columns = vars(`Global Mortality Rates by Age Group (1990-2019)`)) # 设置列标签的位置
  )

格式转换

tbl_1990_ggplot <- bstfun::as_ggplot(year_1990)
tbl_2019_ggplot <- bstfun::as_ggplot(year_2019) 
line <- bstfun::as_ggplot(lines) 

拼图

library(patchwork)

(tbl_1990_ggplot+line+tbl_2019_ggplot)

注:若拼图出现Error in save(plot, file = filename) : reached elapsed time limit Graphics error: Plot rendering error,执行dev.off()关闭画布后重新执行拼图

图形解读

此图主要展示某种疾病下全球不同年龄段1990-2019年度死亡率情况,通过表格与折线图组合的形式来展示数据,左右两侧分别为1990,2019的数据,中间通过折线图的形式来看30年间数据的变化趋势。图表均由R代码生成。