You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R语言ggplot绘制堆叠桑基图?附数据及尝试代码

用ggplot绘制堆叠桑基图的最优实现方法

中风风险因素数据

中风风险因素19901995200020052010
肥胖0.0010.0130.0430.0770.115
糖尿病0.3590.3160.260.1870.092
吸烟0.1710.1560.1420.1280.116
高胆固醇血症0.1610.1040.0450.0010.001
高血压0.6540.6330.6020.5610.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:05:19