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

如何格式化数据框以绘制两个分类变量的ggalluvial冲积图?

报错原因

你的原始数据是每行对应1个个体的长结构,没有预先统计不同分组的频数,所以代码中指定的y = Freq找不到对应字段,才会触发报错。


解决方法1:无需修改原始数据,直接调整绘图代码

ggalluvial原生支持逐行观测的输入格式,不需要提前汇总数据,只需移除y = Freq的映射,给图层指定计数统计即可正常绘图:

library(ggplot2)
library(ggalluvial)

ggplot(data = df, aes(axis1 = classification1, axis2 = classification2)) +
  scale_x_discrete(limits = c("classification1", "classification2"), expand = c(.2, .05)) +
  geom_alluvium(aes(fill = factor(survival)), stat = "count") +
  geom_stratum(stat = "count") +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  # 可选:优化生存状态的图例显示
  scale_fill_discrete(name = "生存状态", labels = c("存活", "死亡"))

解决方法2:预先汇总数据生成Freq列

如果你习惯用汇总后的格式输入,可以先按3个分类变量分组统计频数,生成带Freq字段的数据集后再沿用你原本的代码逻辑:

library(dplyr)
library(ggplot2)
library(ggalluvial)

# 分组计数生成频数字段
df_count <- df %>%
  group_by(classification1, classification2, survival) %>%
  summarise(Freq = n(), .groups = "drop")

# 用汇总后的数据绘图
ggplot(data = df_count, aes(axis1 = classification1, axis2 = classification2, y = Freq)) +
  scale_x_discrete(limits = c("classification1", "classification2"), expand = c(.2, .05)) +
  geom_alluvium(aes(fill = factor(survival))) +
  geom_stratum() +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_fill_discrete(name = "生存状态", labels = c("存活", "死亡"))

两种方案都可以正常输出冲积图,根据你的使用习惯选择即可。

内容的提问来源于stack exchange,提问作者B_slash_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:54:02