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

使用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")

关键调整说明

  1. 修正alluvium映射:将alluvium = sum_n改为alluvium = acc,让ggalluvial识别到是同一个物种在不同场景间的流动
  2. 保留物种对应关系:通过complete()补全所有物种-场景组合,确保每个物种在两个场景下都有数据行(哪怕频次为0)
  3. 优化可视化细节:添加物种名称标签、分层块边框,提升图表可读性

扩展:按站点分组展示

如果需要同时展示不同站点的物种变化,可保留站点信息并添加分面:

# 保留站点维度的版本
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:22:05