基于双因子interaction的堆叠条形图顺序调整问题
解决堆叠条形图中交互因子的堆叠顺序问题
你遇到的问题是因为fill使用的是interaction(country, rain_fall)生成的因子,而ggplot的堆叠顺序默认遵循因子水平的排列顺序,直接在aes里加order=desc()并不能改变堆叠的层级——这个参数更多是用来调整组的顺序,而非堆叠内部的顺序。
下面提供两种简单有效的解决方法,帮你把summer对应的条形移到堆叠底部:
方法一:使用position_stack(reverse = TRUE)反转堆叠顺序
这是最直接的方法,不需要修改因子水平,只需要在geom_bar里指定position参数即可:
library(data.table) library(ggplot2) # 构造数据 country <- rep(c('SE', 'FR', 'BE'), each = 2) rain_fall <- rep(c('winter to spring', 'summer'), 3) amount_rain <- c(100, 10, 95, 5, 70, 2) order <- c(1, 1, 2, 2, 3, 3) DT <- data.table(country, rain_fall, amount_rain, order) DT[, ':='(country = factor(country), rain_fall = factor(rain_fall))] # 绘制堆叠图,反转堆叠顺序 plot_stacked <- ggplot(DT, aes(x = reorder(country, -order), y = amount_rain, fill = interaction(country, rain_fall))) + geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) plot_stacked
这个方法会直接把原本的堆叠顺序反转,让原本在顶部的summer条形落到底部。
方法二:调整interaction生成的因子水平顺序
如果你希望从数据层面固定因子顺序,可以手动调整interaction的水平,让每个国家对应的summer水平排在前面:
# 重新构造interaction因子,指定水平顺序 DT[, fill_group := interaction(country, rain_fall)] # 反转因子水平,或者手动排序 DT[, fill_group := factor(fill_group, levels = rev(levels(fill_group)))] # 绘图 plot_stacked <- ggplot(DT, aes(x = reorder(country, -order), y = amount_rain, fill = fill_group)) + geom_bar(stat = "identity") plot_stacked
这里用rev(levels(fill_group))把原本的因子水平反转,这样堆叠时就会按新的水平顺序排列,summer对应的水平会先被绘制,从而出现在底部。
另外注意你原代码里的小错误:ggplot的aes括号没有闭合,我已经在示例代码里修正了这个问题。
内容的提问来源于stack exchange,提问作者koteletje
相关产品推荐
相关产品推荐

