ggsankey绘图:如何为每个节点添加占比或绝对计数?
桑基图节点添加计数/占比的实现方案
数据集说明
现有患者诊断数据集,包含Baseline、Week1、Week2、Week3四个时间点的诊断结果,每行代表一名患者,结果为1(阳性)或0(阴性),原始数据如下:
Baseline,Week1,Week2,Week3 1,0,0,0 0,0,0,0 1,1,1,0 0,0,0,0 1,0,0,0 0,0,0,0 1,0,0,0 1,,0,0 1,0,0,0 1,1,1,1 1,1,1,1 1,1,1,1 1,1,1,1 0,0,1,0 1,0,0,0 1,1,1,1 0,,0,0 0,0,0,0 1,1,1,1 1,1,1, 0,,,0 0,0,0,0 1,1,0,0 0,1,1,0 1,1,1,1 1,0,0,0 1,0,0, 1,0,0, 1,0,1,0 1,1,1,1 0,0,0,0 1,1,1, 0,1,1,1 0,0,1,0 0,0,0,0 1,0,1,1 1,1,1, 1,1,0,0 1,0,1, 1,,0,1 1,0,1,
现有绘图代码
已使用ggsankey包绘制桑基图,代码如下:
df <- sankey_proportions %>% make_long(Baseline, Week1, Week2, Week3) ggplot(df, aes(x = x, next_x = next_x, node = node, next_node = next_node, fill = factor(node), label = node)) + geom_sankey(flow.alpha = 0.5, node.color = 0.5, width = 0.05) + scale_fill_viridis_d(alpha = 0.7) + theme_sankey(base_size = 10)
实现节点添加计数/占比的步骤
要在节点上显示绝对计数或占比,需要先统计每个节点的对应数值,再将其整合到标签中,具体代码如下:
1. 数据预处理与统计
library(tidyverse) library(ggsankey) # 读取并处理数据(空值替换为NA) data <- read.csv(text = "Baseline,Week1,Week2,Week3 1,0,0,0 0,0,0,0 1,1,1,0 0,0,0,0 1,0,0,0 0,0,0,0 1,0,0,0 1,,0,0 1,0,0,0 1,1,1,1 1,1,1,1 1,1,1,1 1,1,1,1 0,0,1,0 1,0,0,0 1,1,1,1 0,,0,0 0,0,0,0 1,1,1,1 1,1,1, 0,,,0 0,0,0,0 1,1,0,0 0,1,1,0 1,1,1,1 1,0,0,0 1,0,0, 1,0,0, 1,0,1,0 1,1,1,1 0,0,0,0 1,1,1, 0,1,1,1 0,0,1,0 0,0,0,0 1,0,1,1 1,1,1, 1,1,0,0 1,0,1, 1,,0,1 1,0,1,") data[data == ""] <- NA # 转成长格式并统计节点计数与占比 df_long <- data %>% make_long(Baseline, Week1, Week2, Week3) node_stats <- df_long %>% group_by(x, node) %>% summarize(count = n(), .groups = "drop") %>% group_by(x) %>% mutate(percentage = paste0(round(count / sum(count) * 100, 1), "%")) %>% ungroup() # 合并统计结果到绘图数据,构造带计数/占比的标签 df_long <- df_long %>% left_join(node_stats, by = c("x", "node")) %>% mutate( # 仅显示计数的标签 label_count = paste0(node, "\n(n=", count, ")"), # 仅显示占比的标签 label_pct = paste0(node, "\n(", percentage, ")"), # 同时显示计数和占比的标签 label_full = paste0(node, "\nn=", count, " (", percentage, ")") )
2. 绘制带标签的桑基图
选择需要的标签样式,替换aes中的label参数,并添加geom_sankey_label显示标签:
ggplot(df_long, aes(x = x, next_x = next_x, node = node, next_node = next_node, fill = factor(node), label = label_full)) + geom_sankey(flow.alpha = 0.5, node.color = 0.5, width = 0.05) + # 添加节点标签,可调整size、color等参数 geom_sankey_label(size = 3, color = "black") + scale_fill_viridis_d(alpha = 0.7) + theme_sankey(base_size = 10) + labs(fill = "诊断结果")
注意事项
- 缺失值处理:如果不需要保留含缺失值的样本,可在预处理时添加
data <- data %>% drop_na()过滤,但会丢失部分数据,需根据需求选择 - 标签自定义:可根据需要修改标签的格式,比如调整占比的小数位数,或修改换行符位置
- 标签样式调整:
geom_sankey_label支持hjust、vjust、family等参数,可优化标签的位置和字体样式
内容的提问来源于stack exchange,提问作者Vojtech Petr
相关产品推荐
相关产品推荐

