如何用R语言ggplot绘制堆叠桑基图?附数据及尝试代码
用ggplot绘制堆叠桑基图的最优实现方法
中风风险因素数据
| 中风风险因素 | 1990 | 1995 | 2000 | 2005 | 2010 |
|---|---|---|---|---|---|
| 肥胖 | 0.001 | 0.013 | 0.043 | 0.077 | 0.115 |
| 糖尿病 | 0.359 | 0.316 | 0.26 | 0.187 | 0.092 |
| 吸烟 | 0.171 | 0.156 | 0.142 | 0.128 | 0.116 |
| 高胆固醇血症 | 0.161 | 0.104 | 0.045 | 0.001 | 0.001 |
| 高血压 | 0.654 | 0.633 | 0.602 | 0.561 | 0.509 |
需求说明
我希望用ggplot绘制堆叠桑基图(即带有流动连接的分层堆叠条形图),目前已尝试用make_long函数处理数据,但不确定是否正确,求最优实现方法。
最优实现步骤
1. 安装并加载所需包
堆叠桑基图(冲积图)在ggplot生态中最适配的工具是ggalluvial包,同时需要dplyr处理数据:
install.packages(c("ggplot2", "ggalluvial", "dplyr")) library(ggplot2) library(ggalluvial) library(dplyr)
2. 数据预处理
你之前用make_long的思路是完全正确的,这个函数是ggalluvial专门为冲积图设计的数据格式转换工具,能直接把宽格式数据转成绘图所需的长格式:
# 先修正数据框列名(确保第一列为风险因素,后续为年份) colnames(Datatable1) <- c("risk_factor", "1990", "1995", "2000", "2005", "2010") # 转换为冲积图适配的长格式 D2 <- Datatable1 %>% make_long(`1990`, `1995`, `2000`, `2005`, `2010`, id = risk_factor)
转换后的数据会生成三列核心字段:
x:年份y:对应年份的风险占比id:中风风险因素类别
3. 绘制堆叠桑基图
直接用转换后的数据绘图,可调整参数匹配目标效果:
ggplot(D2, aes(x = x, y = y, stratum = id, alluvium = id, fill = id)) + geom_alluvium(width = 1/12) + # 控制分层间流动条的宽度,数值越小越窄 geom_stratum(width = 1/12, color = "black") + # 绘制分层的实心条形,添加边框 geom_text(stat = "stratum", aes(label = id), size = 3) + # 在分层上添加类别标签 scale_fill_viridis_d(option = "plasma") + # 可选配色,避免色彩冲突 labs(x = "年份", y = "风险占比", fill = "中风风险因素", title = "不同年份中风风险因素的堆叠桑基图") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 倾斜年份标签,防止重叠
关键说明
- 如果想要更贴近目标效果,可调整
geom_alluvium和geom_stratum的width参数,或者修改geom_text的位置、大小。 - 若各年份的风险占比总和不为1,可先对数据做归一化处理,确保堆叠比例正确。
内容的提问来源于stack exchange,提问作者ElHombre
相关产品推荐
相关产品推荐

