在R中创建Y轴分层对齐的Alluvial图(保留流量厚度与波形)
实现分层对齐的Alluvial图(消除类别过渡偏移)
需求说明
需要创建Alluvial图,满足以下要求:
- 类别在Y轴分层对齐(同类别在两个时间轴上的Y位置对应),解决示例图中Medium→Medium过渡时的个体“下移”视觉问题
- 保留线条厚度对应案例数量的展示
- 保留Alluvial图的波浪形态
解决方案:使用ggalluvial包的对齐参数
默认的geom_alluvium采用justify对齐方式,会按数据顺序排布流,导致同类别过渡时出现偏移。通过设置align = "center"参数,可让同类别在两个轴上的Y轴中心位置对齐,消除偏移,同时保留原有视觉特性。
完整代码
library(ggplot2) library(ggalluvial) # 构建测试数据 df_test <- data.frame( ID = 1:11, T1 = c("Low", "Very high", "Medium", "Low", "High", "Medium", "High", "Medium", "Low", "High", "Low"), T2 = c("High", "High", "Medium", "Very high", "High", "High", "Medium", "High", "Medium", "High", "Low") ) # 设置类别层级,确保前后时间点的类别顺序统一 cat_levels <- c("Very high","High", "Medium", "Low") df_test$T1 <- factor(df_test$T1, levels = cat_levels) df_test$T2 <- factor(df_test$T2, levels = cat_levels) # 创建分层对齐的Alluvial图 ggplot(df_test, aes(axis1 = T1, axis2 = T2)) + # 核心:设置align = "center"实现同类别Y轴对齐,保留波浪形态和厚度 geom_alluvium(aes(fill = T1), width = 1/12, stat = "alluvium", align = "center") + geom_stratum(width = 1/5) + geom_text(stat = "stratum", aes(label = after_stat(stratum)), size = 3) + scale_x_discrete(limits = c("T1", "T2")) + scale_fill_manual(values = c("Low" = "skyblue", "Medium" = "orange", "High" = "red", "Very high" = "darkred")) + labs(title = "分类从T1到T2的过渡(分层对齐版)", x = "时间点", y = "个体数量", fill = "状态") + theme_minimal() + theme(axis.text.x = element_text(face = "bold", size = 14), axis.text.y = element_blank(), axis.ticks.y = element_blank(), panel.grid.major.y = element_blank())
关键说明
align = "center":让每个类别在两个轴上的Y轴中心位置保持一致,确保同类别过渡的流垂直对齐,消除偏移- 线条厚度自动对应案例数量:
geom_alluvium会根据每个过渡组的个体数自动调整线条粗细 - 波浪形态保留:默认的
geom_alluvium会维持平滑的波浪路径,无需额外设置
内容的提问来源于stack exchange,提问作者Oscar Kjell
相关产品推荐
相关产品推荐

