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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:38:14