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

如何在ggplot分组柱状图中为各组添加数值顶部标记线?

解决方案:ggplot实现柱状图+分组水平标记线

针对需求——第一组数据用蓝色实心柱状图展示,第二组数据仅在对应分组的数值位置添加水平标记线,提供两种简洁实现方式:

方法一:直接用geom_segment绘制水平标记线(推荐)

这种方式无需借助柱子,直接精准绘制对应位置的水平短线,代码更简洁高效:

library(ggplot2)

# 定义数据
Tbl = data.frame(Factor = c("a","b","c","d"),
                 Percent = c(43,77,37,55))

Tbl2 = data.frame(Factor = c("a","b","c","d"),
                  Percent = c(58,68,47,63))

# 将因子转为有序类型,便于计算x轴位置
Tbl$Factor <- factor(Tbl$Factor)
Tbl2$Factor <- factor(Tbl2$Factor)

ggplot(aes(x = Factor, y = Percent), data = Tbl) + 
  # 绘制第一组蓝色柱状图,设置合适宽度
  geom_bar(stat = "identity", fill = "blue", width = 0.7) + 
  # 绘制第二组的水平标记线,短线宽度匹配柱子宽度
  geom_segment(
    data = Tbl2,
    aes(
      x = as.integer(Factor) - 0.35,  # 柱子左边界位置
      xend = as.integer(Factor) + 0.35, # 柱子右边界位置
      y = Percent,
      yend = Percent
    ),
    color = "black",
    size = 1
  ) +
  ylim(0, 100) +
  theme_bw()

方法二:优化原有geom_bar实现

如果要基于你原有的代码修改,通过隐藏柱子侧边边框、仅保留顶部横线来实现:

library(ggplot2)

Tbl = data.frame(Factor = c("a","b","c","d"),
                 Percent = c(43,77,37,55))

Tbl2 = data.frame(Factor = c("a","b","c","d"),
                  Percent = c(58,68,47,63))

ggplot(aes(x = Factor, y = Percent), data = Tbl) + 
  geom_bar(stat = "identity", fill = "blue") +
  ylim(0, 100) +
  # 绘制透明柱子,将左右边框设为白色隐藏
  geom_bar(
    data = Tbl2,
    stat = "identity",
    fill = NA,
    color = "white",
    size = 1
  ) +
  # 单独添加顶部黑色横线
  geom_segment(
    data = Tbl2,
    aes(
      x = as.integer(Factor) - 0.4,
      xend = as.integer(Factor) + 0.4,
      y = Percent,
      yend = Percent
    ),
    color = "black",
    size = 1
  ) +
  theme_bw()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:25:47