ggplot堆叠柱状图:在每个堆叠柱顶部显示对应均值
堆叠柱状图顶部添加均值文本解决方案
原代码问题分析
- 语法错误:
aes中color = Month + label = Class写法错误,柱状图应使用fill映射分组填充色,color默认控制边框颜色 - 未指定
geom_text的独立数据源:直接引用Df_class_mean$Mean_Class会导致主数据框Df_class与均值数据框行数不匹配 - 未正确映射文本与主图的x轴关联关系
方案1:在整个堆叠柱顶部显示该组(series)的均值
假设Df_class_mean包含series(与主图x轴一一对应)和Mean_Class(每组均值)两列,每个series对应一行数据:
ggplot(Df_class, aes(x = series, y = Class, fill = Month)) + geom_col(position = "stack", show.legend = TRUE) + labs(x = "BG ID", y = "Class Total", title = "Class Total") + theme(axis.text = element_text(colour = "black", size = rel(0.45))) + # 指定均值数据源,映射x/y轴与文本内容 geom_text(data = Df_class_mean, aes(x = series, y = Mean_Class, label = round(Mean_Class, 2)), size = 3, vjust = -0.5) # vjust=-0.5将文本放在柱子顶部上方,避免重叠
方案2:在每个堆叠层顶部显示该层(series+Month)的均值
如果需要给每个堆叠子柱添加对应均值,先分组计算层均值,再用position_stack对齐位置:
# 先计算每个series+Month分组的均值 Df_layer_mean <- Df_class %>% group_by(series, Month) %>% summarise(Mean_Class = mean(Class), .groups = "drop") ggplot(Df_class, aes(x = series, y = Class, fill = Month)) + geom_col(position = "stack", show.legend = TRUE) + labs(x = "BG ID", y = "Class Total", title = "Class Total") + theme(axis.text = element_text(colour = "black", size = rel(0.45))) + # 用position_stack对齐堆叠层位置,vjust=1将文本放在层顶部 geom_text(data = Df_layer_mean, aes(x = series, y = Mean_Class, label = round(Mean_Class, 2)), position = position_stack(vjust = 1), size = 3)
内容的提问来源于stack exchange,提问作者MyPimpstyle
相关产品推荐
相关产品推荐

