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

ggplot2中Likert图百分比位置错误的解决咨询

解决ggplot2绘制Likert柱状图时百分比文本位置异常的问题

你的问题出在geom_text的位置计算上:默认情况下,geom_text会把文本放在每个柱子的y=prop位置,但堆叠柱状图的每个分段是叠加的,这个位置其实是当前分段的顶部,导致文本要么超出柱子,要么和其他分段的文本重叠错位,看起来像是倒置。

要解决这个问题,需要计算每个堆叠分段的中心位置——也就是当前分段的底部(前面所有分段的比例之和)加上当前分段比例的一半。可以用dplyr来批量计算这个位置:

步骤1:处理数据,计算文本中心位置

先取消原数据的分组,再按grupo、nivel、tipo分组,计算每个分段的累积起始位置,再算出中心y坐标:

library(dplyr)

# 取消分组并计算中心位置
example_adj <- example %>%
  ungroup() %>%
  group_by(grupo, nivel, tipo) %>%
  # 按likert的顺序排序,确保累积计算正确
  arrange(likert) %>%
  # 计算当前分段的起始位置(前面所有分段的prop之和)
  mutate(cum_prop = cumsum(prop) - prop) %>%
  # 中心位置 = 起始位置 + 当前prop的一半
  mutate(text_y = cum_prop + prop / 2) %>%
  ungroup()

步骤2:修改绘图代码

把geom_text的y映射到刚计算的text_y,同时设置hjust=0.5确保文本水平居中:

ggplot(example_adj, aes(x=interaction(grupo, nivel, tipo), y=prop, fill=likert))+
  geom_col()+
  coord_flip() +
  ggtitle("Testing")+
  xlab("A, B, and C")+
  ylab("%")+
  geom_text(aes(label = proptext, y = text_y), size = 2, colour = "black", hjust = 0.5)

为什么这样有效?

堆叠柱状图的每个分段是从cum_prop(前面所有分段的总和)开始,到cum_prop + prop结束,text_y取这个区间的中点,就能让百分比文本精准落在每个分段的中心位置,不会再出现错位或倒置的情况。

内容的提问来源于stack exchange,提问作者Wellington Almeida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:56:13