You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot多变量柱状图中重新排序填充系列?

调整ggplot分组柱状图的填充系列自定义顺序

我用以下代码在ggplot中绘制柱状图,以location为x轴,direction为填充系列:

ggplot(bp, aes(location, avg, fill=direction)) +
    geom_bar(stat="identity", position = "dodge")

得到的图表如下:
分组柱状图

但我希望每组内的柱子顺序为W在左、E在右。我知道ggplot中有reorder()函数,但不清楚如何针对以下场景使用:

  • 调整填充系列而非x轴值的顺序
  • 对分类变量进行自定义排序而非按数值升降排序

数据如下:

bp <- data.frame(
  avg = c(
    0.290295409135636, 0.662679922241013, 0.0157451189744425, 0.458147570483339,
    0.281818457065378, 0.821172852462277, 0.260305525502705, 0.0588071699123448,
    0.208385246183277
  ),
  location = rep(c("Narraguagus", "Bluehill", "Jericho"), 3),
  direction = rep(c("R", "W", "E"), each = 3L)
)

解决方案:自定义因子水平顺序

reorder()是基于数值对分类变量排序的,不适合自定义顺序的场景。要调整填充系列的顺序,直接把direction转换成指定顺序的因子即可:

  1. 修改数据的因子水平
    给direction列设置自定义的因子水平顺序,按你想要的柱子排列顺序指定levels参数:

    bp$direction <- factor(bp$direction, levels = c("W", "E", "R"))
    

    这里把顺序设为W→E→R,绘图时每组内的柱子就会按这个顺序排列。

  2. 重新绘制图表
    使用修改后的数据绘图,就能得到你想要的柱子顺序:

    ggplot(bp, aes(location, avg, fill=direction)) +
        geom_bar(stat="identity", position = "dodge")
    

原理说明

ggplot默认按照分类变量的因子水平顺序来排列元素。当你把字符型的direction转为因子并指定levels时,就强制设定了它的显示优先级,从而实现自定义的柱子排序。


内容的提问来源于stack exchange,提问作者rose_t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:47:25