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

