如何在ggalluvial冲积图中按Type分组排序各Stratum层
问题:调整ggalluvial冲积图中层(Stratum)的垂直排序
我有如下格式的数据集:
results <- as.data.frame(cbind(c("Violence", "Violence", "Violence", "Violence", "Economic", "Economic","Economic","Economic","Institutional","Institutional","Institutional","Institutional"), c("No", "No", "Yes", "Yes","No", "No", "Yes", "Yes", "No", "No", "Yes", "Yes"), c("Yes", "No", "Yes", "No","Yes", "No", "Yes", "No", "Yes", "No", "Yes", "No"), c(3,3,1,3,4,5,8,7,6,5,4,3))) colnames(results) <- c("Type", "Test1", "Test2", "Freq")
随后我使用ggalluvial包绘制冲积图,代码如下:
library(ggplot2) library(tidyverse) library(ggalluvial) ggplot(data = results, aes(axis1 = Type, axis2 = Test1, axis3 = Test2, y = Freq)) + scale_x_discrete(limits = c("Article", "False 0s Removed", "New Flow Measure"), expand = c(.2, .05)) + xlab("Results") + geom_flow(aes(fill = Type)) + geom_stratum() + geom_text(stat = "stratum", aes(label = after_stat(stratum))) + theme_minimal() + ggtitle("Replication Summary")
当前绘图效果基本符合预期,但我希望每个Stratum(层)的垂直顺序按Type分组,使每个层类似条形图,便于查看各Type在Test1、Test2中“Yes”和“No”的占比。目前Test1层的排序符合要求,但Test2层未达到预期,请问该如何修改实现需求?
解决方案
要让所有轴的层都按Type分组排序,核心是通过order参数绑定Type字段,控制层内元素的垂直顺序,同时修复原数据的类型问题。
修改后的完整代码
library(ggplot2) library(tidyverse) library(ggalluvial) # 将Freq列转为数值型(原数据通过cbind生成后为字符类型,会导致高度计算异常) results$Freq <- as.numeric(results$Freq) ggplot(data = results, aes(axis1 = Type, axis2 = Test1, axis3 = Test2, y = Freq)) + scale_x_discrete(limits = c("Article", "False 0s Removed", "New Flow Measure"), expand = c(.2, .05)) + xlab("Results") + # 指定flow的排序依据为Type,确保流向分组一致 geom_flow(aes(fill = Type, order = Type)) + # 指定层的排序依据为Type,让每个轴的区块按Type分组排列 geom_stratum(aes(order = Type)) + # 文本层同步排序,避免标签错位 geom_text(stat = "stratum", aes(label = after_stat(stratum), order = Type)) + theme_minimal() + ggtitle("Replication Summary")
关键说明
- 修复数据类型:原数据中
Freq列是字符类型,必须转为数值型才能正确计算层的高度,否则会出现绘图异常。 - 绑定
order = Type:在geom_flow、geom_stratum、geom_text三个图层中都添加该参数,确保Test2轴的每个“Yes/No”类别下,Violence、Economic、Institutional三个分组保持和Type轴、Test1轴一致的垂直顺序,实现类似分组条形图的视觉效果。
内容的提问来源于stack exchange,提问作者Benjamin Krick
相关产品推荐
相关产品推荐

