如何在ggplot堆叠条形图的对应堆叠中间放置ZipfColl_mean值?
解决ggplot堆叠条形图文本居中问题
要将ZipfColl_mean放置在对应堆叠块的中间,核心是基于堆叠的实际高度计算文本的y坐标,而非直接用ZipfColl_mean作为y值(y轴是条形的计数,和ZipfColl数值无关)。以下是修正后的实现:
步骤1:预处理数据,统计计数与文本位置
手动统计每个分组的条形高度(计数),并计算每个堆叠块的中间位置:
library(viridis) library(hrbrthemes) library(ggplot2) library(dplyr) # 统计分组计数、计算均值,同时算出堆叠中间位置 adj_summary <- adj %>% # 按所有维度分组,确保每个堆叠块的计数和均值准确 group_by(Feedbackposition, Referenzstruktur, Adjektivsemantik, Struktur2) %>% summarise( count = n(), ZipfColl_mean = round(mean(ZipfColl), 2), .groups = "drop_last" ) %>% # 按fill的类别排序,保证堆叠顺序和计算的累计值对应 arrange(Struktur2) %>% mutate( cumulative_count = cumsum(count), # 堆叠块的中间位置 = 累计高度 - 当前块高度的一半 text_y = cumulative_count - count / 2 )
步骤2:绘制带居中文本的堆叠条形图
改用geom_col(等价于geom_bar(stat="identity"))直接使用预处理好的计数数据,将文本的y值设为计算好的text_y:
ggplot(adj_summary, aes(x = Adjektivsemantik, y = count, fill = Struktur2)) + geom_col(position = "stack") + scale_fill_viridis(discrete = T, option = "E", name = "Structure", labels = c("full", "fragment", "topic drop")) + # 文本绑定计算好的中间位置y值 geom_text(aes(y = text_y, label = ZipfColl_mean), color = "red") + facet_grid(rows = vars(Feedbackposition), cols = vars(Referenzstruktur), switch = "y") + theme_ipsum() + xlab("") + ylab("Count")
关键修正点
- 放弃自动统计计数:原来的
geom_bar(stat="count")无法直接获取堆叠高度数据,手动统计后能精准计算文本位置。 - 匹配堆叠顺序:按
Struktur2排序后计算累计值,确保文本位置和堆叠块一一对应。 - 修正均值分组:原来仅按
Struktur2分组计算均值,现在按所有维度分组,保证每个堆叠块对应正确的ZipfColl_mean值。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

