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

如何在ggplot2的geom_bar柱状图中添加百分比标签?

替换柱状图标签为百分比的解决方案

我来帮你把柱状图上的绝对值标签换成对应的百分比,其实只需要调整数据的组织方式和geom_text的参数就行,给你两种简洁的实现方式:

方法一:分开处理绝对值和百分比数据

这种方式逻辑清晰,适合刚接触ggplot2的朋友:

library(ggplot2)
library(reshape2)

# 原始数据定义
protsComp = c(232,62,53,56,61)
protsPart = c(238,64,54,58,62)
percComp = c(93.55,93.94,94.64,91.80,93.85)
percPart = c(95.97,96.97,96.43,95.08,95.38)
xaxis = c("Total", "Group 1", "Group 2", "Group 3", "Group 4")

# 构建绝对值数据的长格式(用于绘制柱子)
cegma_counts = data.frame(xaxis, Complete = protsComp, Partial = protsPart)
cegma_counts.long = melt(cegma_counts)

# 构建百分比数据的长格式(用于标签)
cegma_percs = data.frame(xaxis, Complete = percComp, Partial = percPart)
cegma_percs.long = melt(cegma_percs)

# 绘制图表:柱子用绝对值,标签用百分比
ggplot(cegma_counts.long, aes(x = xaxis, y = value, fill = variable)) +
  geom_bar(position = "dodge", stat = "identity", color = "black") +
  geom_text(
    data = cegma_percs.long,  # 指定用百分比数据做标签
    aes(x = xaxis, y = cegma_counts.long$value, label = paste0(value, "%")),
    position = position_dodge(width = 0.9),  # 和柱子对齐
    vjust = 3.5  # 调整标签位置,避免和柱子重叠
  )

方法二:整合数据到一个数据框(更简洁)

如果想让代码更紧凑,可以把绝对值和百分比整合到同一个数据框里,一次性转成长格式:

library(ggplot2)
library(reshape2)

protsComp = c(232,62,53,56,61)
protsPart = c(238,64,54,58,62)
percComp = c(93.55,93.94,94.64,91.80,93.85)
percPart = c(95.97,96.97,96.43,95.08,95.38)
xaxis = c("Total", "Group 1", "Group 2", "Group 3", "Group 4")

# 整合绝对值和百分比到宽格式数据框
cegma_combined = data.frame(
  xaxis,
  Complete_count = protsComp,
  Complete_perc = percComp,
  Partial_count = protsPart,
  Partial_perc = percPart
)

# 转成长格式,同时保留计数和百分比列
cegma_combined.long = melt(
  cegma_combined, 
  id.vars = "xaxis", 
  measure.vars = list(count = c("Complete_count", "Partial_count"),
                      perc = c("Complete_perc", "Partial_perc")),
  variable.name = "variable",
  value.name = c("count", "perc")
)

# 绘图时直接调用对应列
ggplot(cegma_combined.long, aes(x = xaxis, y = count, fill = variable)) +
  geom_bar(position = "dodge", stat = "identity", color = "black") +
  geom_text(
    aes(label = paste0(perc, "%")),
    position = position_dodge(width = 0.9),
    vjust = 3.5
  )

关键说明

  • 两种方法的核心都是让百分比数据和柱子的分组(Complete/Partial)、x轴类别完全对应,这样标签才会精准匹配到对应的柱子上。
  • 用paste0(value, "%")给百分比加上百分号,让图表更易读。
  • 调整vjust参数可以控制标签在柱子上方的位置,避免和柱子重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:43:53