使用ggplot绘制Sankey图:实验参数可视化的数据格式问题
解决Sankey图标签与条形比例问题
问题根源
- 原代码中
make_long自动生成节点编号,未关联参数名称(parm),导致标签显示错误。 - 未过滤值为0的参数,生成了无意义的空节点,干扰条形比例。
- 未在绘图映射中指定
value字段,节点大小无法匹配参数值。
修正后完整代码
数据处理部分
library(tidyverse) library(ggsankey) # 原始数据定义 doc1 <- tribble( ~parm, ~value, "b1", 0.009, "g1", 0.664, "b2", 0.000, "ra", 0.000, "rc", 0.000, "ax", 0.084, "cx", 0.086, "ex", 0.179, "ay", 0.045, "cy", 0.043, "ey", 0.102 ) %>% mutate(model = "exp") doc2 <- tribble( ~parm, ~value, "b1", 0.181, "g1", 0.289, "b2", 0.181, "ra", 0.000, "rc", 0.000, "ax", 0.001, "cx", 0.001, "ex", 0.002, "ay", 0.001, "cy", 0.001, "ey", 0.002, "re", 0.000, "rf", 0.000, "b3", 0.289 ) %>% mutate(model = "exp2") # 合并并清洗数据 combined <- bind_rows(doc1, doc2) %>% filter(value > 0) %>% # 移除值为0的无效参数 pivot_wider(names_from = model, values_from = value, values_fill = 0) # 转换为Sankey图所需格式,绑定参数名称作为节点ID finalpow <- combined %>% make_long(exp, exp2, id = parm)
绘图部分
ggplot(finalpow, aes( x = x, next_x = next_x, node = id, # 使用参数名作为节点标识 next_node = next_id, fill = factor(id), # 按参数名填充颜色 label = id, # 标签显示参数名 value = value # 用参数值控制流量与节点大小 )) + geom_sankey(flow.alpha = 0.5, node.color = 1) + geom_sankey_label(size = 3.5, color = 1, fill = "white") + scale_fill_viridis_d() + theme_sankey(base_size = 16) + guides(fill = guide_legend(title = "参数名称")) + labs(x = NULL)
关键修正点
- 过滤无效数据:通过
filter(value > 0)移除值为0的参数,避免空节点干扰图表。 - 绑定节点标识:
make_long中指定id = parm,让节点直接关联参数名称,解决标签错误问题。 - 映射数值字段:在
aes中添加value = value,确保条形大小与参数值成比例。
内容的提问来源于stack exchange,提问作者lf_araujo
相关产品推荐
相关产品推荐

