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

在ggplot2常规柱状图中仅展示分组小计数值的问题求助

在ggplot2常规柱状图中仅展示分组小计数值的问题求助

看起来你现在遇到的问题是,柱状图上每个分组里挤了一堆数值,而你只想展示每个trans分组的hwy小计(总和)对吧?这是因为你的geom_text直接调用了原始数据里的每一行hwy值,同一分组下的多个数据点对应的文本都叠在一起了,所以看起来乱糟糟的。

我给你两种解决方案,你可以根据需求选择:

首先我们需要先对数据按trans分组,计算每个分组的hwy总和,这里用dplyr包来处理很方便:

library(dplyr)
# 按trans分组计算hwy总和
df_summary <- df.mpg %>%
  group_by(trans) %>%
  summarize(total_hwy = sum(hwy))

方式一:用汇总数据绘制柱状图并添加小计文本

这种方式更直接,因为我们的柱状图本来就是要展示分组总和,直接用汇总后的数据绘图:

library(ggplot2)
gp.mpg <- ggplot(df_summary, aes(x = trans, y = total_hwy)) +
  geom_bar(stat = "identity", fill = "navy", alpha = 0.5) +
  labs(title = "", x = "", y = "") +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10)) +
  # 把小计文本放在柱子上方,避免重叠,vjust可以调整位置
  geom_text(aes(label = total_hwy), size = 3, vjust = -0.5, hjust = 0.5)

gp.mpg

方式二:保留原始数据绘制柱子,仅用汇总数据添加文本

如果你因为某些原因想保留原始数据绘制柱状图(其实stat="identity"对同一x的多个y值默认是堆叠,柱子高度刚好就是总和),可以给geom_text指定汇总后的数据源:

gp.mpg <- ggplot(df.mpg, aes(x = trans, y = hwy)) +
  geom_bar(stat = "identity", fill = "navy", alpha = 0.5) +
  labs(title = "", x = "", y = "") +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10)) +
  # 指定data为汇总数据,同时对应y值为总和
  geom_text(data = df_summary, aes(y = total_hwy, label = total_hwy), 
            size = 3, vjust = -0.5, hjust = 0.5)

gp.mpg

这样调整后,每个trans分组的柱子上就只会显示对应的hwy总和,不会再出现一堆重叠的数值了。你可以根据自己的需求调整vjust的数值,来改变文本在柱子上的位置(比如vjust=1.5会把文本放在柱子内部靠下的位置)。

备注:内容来源于stack exchange,提问作者Gambit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:24:39