使用ggalluvial绘制物种组成变化桑基图报错求助
解决ggalluvial桑基图报错并生成物种组成变化图
报错原因
你的代码报错核心是数据格式不符合ggalluvial的要求:
alluvium参数应映射到连接不同x轴类别的分组变量(此处为物种acc),而非数值sum_n- 最后一步
group_by(scenario, acc) %>% summarise()丢失了物种在两个场景间的对应关系,导致工具无法识别为冲积图格式
修正后的完整代码
以下代码可正确生成符合预期的桑基图:
library(ggalluvial) library(tidyverse) # 测试数据初始化 df_test <- data.frame(site = c(1,1,1,2,2,1,2,2,2,2), site_ch = c("a","a","a","b","b","a","b","b","b","b"), acc = c("piab", "abies", "fasy", "piab", "fasy", "frax", "piab", "fasy", "frax", "abies"), scenario = rep(c("current", 'rcp25'), each = 5)) %>% mutate(acc = factor(acc), site_ch = factor(site_ch), scenario = factor(scenario)) # 数据预处理:确保每个物种在两个场景下都有记录 df_alluvial <- df_test %>% # 按站点、场景、物种统计出现频次 count(site, scenario, acc, name = "freq") %>% # 补全所有物种-场景-站点组合,缺失的频次填0 complete(site, scenario, acc, fill = list(freq = 0)) %>% # 按物种和场景汇总总频次 group_by(scenario, acc) %>% summarise(total_freq = sum(freq, na.rm = TRUE), .groups = "drop") %>% # 固定场景顺序,保证current在前、rcp25在后 mutate(scenario = factor(scenario, levels = c("current", "rcp25"))) # 绘制桑基图 ggplot(df_alluvial, aes(x = scenario, stratum = acc, alluvium = acc, # 关键:用物种作为连接不同场景的分组变量 y = total_freq, fill = acc)) + geom_alluvium(alpha = 0.6) + # 绘制物种跨场景的连接流 geom_stratum(color = "white") + # 绘制分层块,添加白色边框提升可读性 geom_text(stat = "stratum", aes(label = acc)) + # 在分层块上标注物种名称 theme_minimal() + labs(title = "物种组成跨气候变化场景变化", x = "场景", y = "总出现频次", fill = "物种") + scale_fill_brewer(palette = "Set2")
关键调整说明
- 修正alluvium映射:将
alluvium = sum_n改为alluvium = acc,让ggalluvial识别到是同一个物种在不同场景间的流动 - 保留物种对应关系:通过
complete()补全所有物种-场景组合,确保每个物种在两个场景下都有数据行(哪怕频次为0) - 优化可视化细节:添加物种名称标签、分层块边框,提升图表可读性
扩展:按站点分组展示
如果需要同时展示不同站点的物种变化,可保留站点信息并添加分面:
# 保留站点维度的版本 df_alluvial_site <- df_test %>% count(site, scenario, acc, name = "freq") %>% complete(site, scenario, acc, fill = list(freq = 0)) %>% mutate(scenario = factor(scenario, levels = c("current", "rcp25")), site = paste("站点", site)) ggplot(df_alluvial_site, aes(x = scenario, stratum = acc, alluvium = acc, y = freq, fill = acc)) + geom_alluvium(alpha = 0.6) + geom_stratum(color = "white") + geom_text(stat = "stratum", aes(label = acc), size = 3) + facet_wrap(~site) + # 按站点分面展示 theme_minimal() + labs(title = "各站点物种组成跨气候变化场景变化", x = "场景", y = "出现频次", fill = "物种") + scale_fill_brewer(palette = "Set2")
内容的提问来源于stack exchange,提问作者maycca
相关产品推荐
相关产品推荐

