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

ggplot:堆叠条形图添加文本标签及次坐标轴均值问题

问题解答

问题1:堆叠条形图文本标签异常

你的代码里geom_text没设置堆叠位置参数,导致所有文本标签都挤在柱子底部重叠在一起。给geom_text加上position = position_stack(vjust = 0.5),就能让标签居中显示在对应堆叠区域内。

修正后的完整代码:

# Sample Data
n <- 100
df <- data.frame(item = sample(paste("Item", 1:4), size=n, replace=TRUE),
                 value = sample(1:5, size=n, replace=TRUE))


# Create stacked barplot
df %>% group_by(item) %>%
  count(value) %>%
  mutate(percent = 1 / sum(n) * n,
         answer = factor(value, ordered=TRUE)) %>%
  
  ggplot(aes(x = item, y = percent, fill = fct_rev(answer))) + 
    geom_col() +
    scale_y_continuous(labels = scales::percent) +
    geom_text(aes(label = paste0(round(percent, 1), "%")), # 加上%让百分比更直观
              position = position_stack(vjust = 0.5)) +
    labs(fill = "Answer")

注:如果不需要标签带%符号,删掉paste0部分即可

问题2:添加次坐标轴展示均值

虽然你清楚统计上的矛盾,但可以通过坐标轴转换实现需求。具体步骤如下:

  1. 先计算每个item的均值
  2. 建立主轴(0-1,百分比)和次轴(1-5,均值范围)的转换关系:次轴值 = 主轴值×4 +1,主轴值 = (次轴值-1)/4
  3. 用geom_point绘制均值点,对应转换后的主轴位置
  4. 在scale_y_continuous中配置次坐标轴

完整代码:

# 计算每个item的均值
mean_df <- df %>% 
  group_by(item) %>% 
  summarize(mean_val = mean(value))

# 绘制图表
df %>% group_by(item) %>%
  count(value) %>%
  mutate(percent = 1 / sum(n) * n,
         answer = factor(value, ordered=TRUE)) %>%
  
  ggplot(aes(x = item, y = percent, fill = fct_rev(answer))) + 
    geom_col() +
    # 设置主、次坐标轴
    scale_y_continuous(
      labels = scales::percent,
      sec.axis = sec_axis(
        trans = ~ .x*4 +1, # 主轴转次轴的公式
        name = "均值",
        breaks = 1:5
      )
    ) +
    geom_text(aes(label = paste0(round(percent, 1), "%")),
              position = position_stack(vjust = 0.5)) +
    # 添加均值点,y值转换为主轴范围
    geom_point(data = mean_df, 
               aes(x = item, y = (mean_val -1)/4, fill = NULL),
               color = "red", size = 3) +
    labs(fill = "Answer")

注:均值点用红色突出,可根据需求调整颜色、大小等参数

内容的提问来源于stack exchange,提问作者D. Studer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:15:06