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

ggplot2分面堆叠条形图添加总计标签与修改轴标签方法咨询

解决方案

有两种常用实现方式,可根据你的排版偏好选择:

方案1:修改X轴标签嵌入总计值

你提到的将foo改为foo\n8的需求可以直接通过修改分类标签实现,完整代码如下:

library(tibble)
library(tidyr)
library(dplyr)
library(ggplot2)

set.seed(123) # 固定随机数方便复现效果
test <- tibble(
  cat1 = c(rep('foo',6),rep('bar',6)),
  cat2 = rep(c('g1','g2','g3','g4','g5','g6'), 2),
  zoom = rnorm(12, 0, 10),
  zaps = rnorm(12, 5, 10),
  buzz = rnorm(12, -5, 10)
) %>% pivot_longer(c(zoom,zaps,buzz),names_to = 'cat3', values_to='value')

test2 <- inner_join(test, summarise(group_by(test, cat1, cat2), agg = sum(value))) %>%
  # 给cat1拼接总计值,换行显示
  mutate(cat1 = paste0(cat1, "\n", as.integer(agg)))

ggplot(test2, aes(x = cat1, y = value, fill = cat3, label = as.integer(value))) +
  geom_bar(stat = 'identity', position = 'stack') +
  geom_text(position = position_stack(vjust = 0.5), size = 3, color = "#555555") +
  geom_errorbar(aes(ymin = agg, ymax = agg)) +
  facet_grid(~ cat2)

方案2:柱形顶部添加总计标签(通用方法)

如果不想修改X轴标签,直接在每根柱子的顶部边缘添加总计标签更直观,只需要新增一层去重后的geom_text图层即可,完整代码如下:

library(tibble)
library(tidyr)
library(dplyr)
library(ggplot2)

set.seed(123) # 固定随机数方便复现效果
test <- tibble(
  cat1 = c(rep('foo',6),rep('bar',6)),
  cat2 = rep(c('g1','g2','g3','g4','g5','g6'), 2),
  zoom = rnorm(12, 0, 10),
  zaps = rnorm(12, 5, 10),
  buzz = rnorm(12, -5, 10)
) %>% pivot_longer(c(zoom,zaps,buzz),names_to = 'cat3', values_to='value')

test2 <- inner_join(test, summarise(group_by(test, cat1, cat2), agg = sum(value)))

ggplot(test2, aes(x = cat1, y = value, fill = cat3, label = as.integer(value))) +
  geom_bar(stat = 'identity', position = 'stack') +
  geom_text(position = position_stack(vjust = 0.5), size = 3, color = "#555555") +
  geom_errorbar(aes(ymin = agg, ymax = agg)) +
  # 新增总计标签图层,先去重避免同一个标签重复打印多次
  geom_text(data = . %>% distinct(cat1, cat2, agg), 
            aes(y = agg, label = as.integer(agg)), 
            vjust = -0.3, # 调整标签和柱子顶部的距离,负数为向上偏移
            size = 3.5, 
            color = "#000000") +
  facet_grid(~ cat2)

如果需要把标签放在X轴标签上方,只需要调整vjust参数为正数,让标签向下偏移到对应位置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:18:00