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
相关产品推荐
相关产品推荐

