如何格式化数据框以绘制两个分类变量的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_
相关产品推荐
相关产品推荐

