ggalluvial冲积图优化:拆分大类别与调整图例标签大小
解决冲积图的两个适配问题
问题1:主变量index的A1、A2类别规模过大挤压其余类别
针对该问题,提供两种可行解决办法:
方案1:对y轴进行对数变换
由于数据存在freq=0的情况,先给freq加极小值避免对数报错,再通过对数变换压缩大类别占比,同时还原原始数值标签:
library(ggplot2) library(ggalluvial) ggplot(data = sni_long, aes(axis1 = index, axis2 = Avdelning, y = freq + 1)) + geom_alluvium(aes(fill = Avdelning)) + geom_stratum() + geom_text(stat = "stratum", aes(label = after_stat(stratum))) + scale_x_discrete(limits = c("Index", "Avdelning"), expand = c(0.15, 0.05)) + scale_y_log10(labels = function(x) x - 1) + theme_void()
方案2:拆分index为多轴分层展示
将index按规模分组,通过新增中间轴分散大类别占比,避免小类别被挤压:
library(ggplot2) library(ggalluvial) # 给index按规模分组 sni_long$index_group <- ifelse(sni_long$index %in% c("A1", "A2"), "Large", "Small") ggplot(data = sni_long, aes(axis1 = index_group, axis2 = index, axis3 = Avdelning, y = freq)) + geom_alluvium(aes(fill = Avdelning)) + geom_stratum() + geom_text(stat = "stratum", aes(label = after_stat(stratum))) + scale_x_discrete(limits = c("Group", "Index", "Avdelning"), expand = c(0.1, 0.05)) + theme_void()
问题2:Avdelning类别过多导致图例溢出
提供两种优化图例的方案:
方案1:调整图例为多列并放置于底部
通过设置图例排列方式和位置,避免溢出:
library(ggplot2) library(ggalluvial) ggplot(data = sni_long, aes(axis1 = index, axis2 = Avdelning, y = freq)) + geom_alluvium(aes(fill = Avdelning)) + geom_stratum() + geom_text(stat = "stratum", aes(label = after_stat(stratum))) + scale_x_discrete(limits = c("Index", "Avdelning"), expand = c(0.15, 0.05)) + theme_void() + theme( legend.position = "bottom", legend.direction = "horizontal", legend.text = element_text(size = 8), legend.key.size = unit(0.5, "cm") ) + guides(fill = guide_legend(ncol = 4))
方案2:移除图例,直接在轴上标注Avdelning类别
完全替代图例,将类别标签直接放在对应轴的分层块上:
library(ggplot2) library(ggalluvial) ggplot(data = sni_long, aes(axis1 = index, axis2 = Avdelning, y = freq)) + geom_alluvium(aes(fill = Avdelning)) + geom_stratum() + # 标注index轴类别 geom_text(stat = "stratum", aes(label = after_stat(stratum)), subset = .(x == 1), size = 3.5) + # 标注Avdelning轴类别,替代图例 geom_text(stat = "stratum", aes(label = after_stat(stratum)), subset = .(x == 2), size = 3.5) + scale_x_discrete(limits = c("Index", "Avdelning"), expand = c(0.15, 0.05)) + theme_void() + theme(legend.position = "none")
内容的提问来源于stack exchange,提问作者Chrysa
相关产品推荐
相关产品推荐

