如何在R语言中调整分组柱状图(dodged columns)的排列顺序?
解决分组柱状图按rank降序排列的问题
你的问题核心在于数值型的rank变量没有被正确转换为带指定顺序的因子,且ggplot的元素顺序由因子水平(levels)而非数据框行顺序决定,以下是具体解决步骤:
问题分析
- 直接用
y=factor(rank, levels=rev(levels(rank)))报错,是因为数值型变量rank本身没有levels属性,无法直接反转; - 对数据框按
mo和-rank排序无效,因为ggplot不依赖数据行顺序来决定元素排列,而是遵循因子的水平顺序; position_dodge2(reverse=TRUE)仅调整同组内柱子的相对位置,但前提是已经通过因子水平定义了正确的排序逻辑。
修正代码
str1 <- data.frame( mo = c('jan', 'feb', 'mar', 'apr', 'may', 'jan', 'feb', 'jan', 'apr', 'apr', 'feb', 'may', 'feb', 'may', 'apr', 'jun', 'apr', 'jun', 'apr', 'jun'), rank = c(9.5, 9.2, 9.1, 9.1, 9.0, 8.8, 8.7, 8.7, 8.6, 8.6, 8.6, 8.6, 8.5, 8.5, 8.5, 8.4, 8.4, 8.4, 8.4, 8.8), value= c(2226, 139, 18428, 227899, 10000, 558, 1, 700, 10, 1313, 2, 1530, 1, 700, 1530, 168, NA, 50, NA, 3022)) # 1. 提取rank的唯一值并按降序生成因子水平 rank_levels <- sort(unique(str1$rank), decreasing = TRUE) str1$rank <- factor(str1$rank, levels = rank_levels) # 2. 绘制图形,coord_flip后rank的降序会对应垂直方向的从上到下排列 ggplot(str1, aes(x = reorder(mo, -value), y = rank, fill = value)) + geom_col(position = position_dodge2(preserve = "single")) + coord_flip()
关键说明
- 先将
rank转换为因子并指定降序的水平,ggplot会严格按照这个水平顺序排列柱子; reorder(mo, -value)用于调整月份(mo)的顺序,若不需要可直接用x=mo;coord_flip翻转轴后,rank的降序会对应垂直方向(原y轴)的从上到下排列,符合你要的降序显示需求。
内容的提问来源于stack exchange,提问作者pixel9
相关产品推荐
相关产品推荐

