geom_alluvium双轴排序异常:仅单轴生效的解决求助
解决ggalluvial桑基图End轴排序不生效的问题
你的问题核心在于**lode.guidance = "forward"参数强制End轴的层(stratum)跟随Start轴的流向排序**,覆盖了你设置的End因子水平顺序,同时原始数据的因子转换存在类型匹配问题,以下是分步解决方法:
1. 修正因子转换逻辑
原始数据中Start和End是数值型,直接用字符型levels转换因子会导致类型隐式转换,建议先将列转为字符再设置因子顺序:
data$Start <- factor(as.character(data$Start), levels = c("2", "1", "3","4", "5")) data$End <- factor(as.character(data$End), levels = c("3", "2", "1","4", "5","6"))
2. 覆盖End轴的排序引导
默认lode.guidance = "forward"会让End轴的层跟着Start轴的流向排列,需要通过以下两种方式之一修正:
方法一:调整lode.guidance参数
将lode.guidance设为"none",让每个轴独立按自身因子顺序排序:
ggplot(data = data, aes(axis1 = Start, axis2 = End, y = Area)) + geom_alluvium(lode.guidance = "none", # 关键修改:取消流向引导 aes(fill = Start),width = 0.1,alpha = 0.8,knot.pos = 0,curve_type = "quintic") + geom_stratum(width = 1/7) + geom_text(stat = "stratum", aes(label = after_stat(stratum))) + scale_x_discrete(limits = c("1960s", "2020s"), expand = c(0.15, 0.05)) + theme_void() + scale_fill_manual(values = c("1" = "#4a69bd", "2" = "#54a0ff", "3" = "#82ccdd", "4" = "#b8e994", "5" = "#ff9ff3", "6" = '#e55039'))+ labs(y = "", fill = "") + theme(legend.position = "none")
方法二:手动指定End轴的层排序
如果需要保留lode.guidance = "forward"的流线引导逻辑,可在geom_stratum和geom_text中通过order参数强制按End的因子顺序排序:
ggplot(data = data, aes(axis1 = Start, axis2 = End, y = Area)) + geom_alluvium(lode.guidance = "forward", aes(fill = Start),width = 0.1,alpha = 0.8,knot.pos = 0,curve_type = "quintic") + # 关键修改:给End轴的stratum指定排序 geom_stratum(width = 1/7, aes(order = ifelse(after_stat(axis) == 2, after_stat(stratum), after_stat(order)))) + geom_text(stat = "stratum", aes(label = after_stat(stratum), order = ifelse(after_stat(axis) == 2, after_stat(stratum), after_stat(order)))) + scale_x_discrete(limits = c("1960s", "2020s"), expand = c(0.15, 0.05)) + theme_void() + scale_fill_manual(values = c("1" = "#4a69bd", "2" = "#54a0ff", "3" = "#82ccdd", "4" = "#b8e994", "5" = "#ff9ff3", "6" = '#e55039'))+ labs(y = "", fill = "") + theme(legend.position = "none")
原理说明
lode.guidance = "forward"会让下游轴(End)的层按上游轴(Start)的分组顺序排列,保证流线尽可能不交叉,但会覆盖你设置的因子顺序;- 因子转换时必须保证原始值与levels的类型一致(数值转字符后再设因子),否则R会自动转换导致levels不匹配;
- 方法一适合完全独立排序双轴,方法二适合保留流线逻辑的同时强制End轴排序。
内容的提问来源于stack exchange,提问作者Evans Liu
相关产品推荐
相关产品推荐

