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

解决R语言堆叠条形图(geom_text)标签重叠问题

解决方案:分离小占比标签到条形外部并添加连线

要实现仅将小占比标签移到条形外并保留连线,同时维持其他标签的居中对齐,可以通过以下步骤处理:

  1. 预处理数据,计算堆叠中点位置:先计算每个分段的百分比,再算出每个堆叠块的中点坐标,方便后续定位标签和连线。
  2. 分两组绘制标签:将占比低于阈值(比如5%,可根据需求调整)的标签单独移到条形外侧,其余标签留在条形内居中。
  3. 添加连线连接小标签与对应区域:用线段连接外侧标签和其对应的条形块右端点,确保关联清晰。

完整代码

library(tidyverse)
library(forcats)
library(scales)

# 原始数据
Position <- rep(c("LeiterIn", "AssistentIn", "ElementarpädagogIn"), each = 30) 
Subjektiver_Gesundheitszustand <- c(1,3,4,5,2,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,
                                    3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5, 
                                    3,4,5,3,4,5)
dat <-  data.frame(Position, Subjektiver_Gesundheitszustand)

# 数据预处理:计算百分比、堆叠中点
dat_summary <- dat %>%
  dplyr::count(Position, Subjektiver_Gesundheitszustand) %>%
  group_by(Position) %>%
  mutate(Pct = n / sum(n)) %>%
  arrange(Position, Subjektiver_Gesundheitszustand) %>% # 与填充顺序保持一致
  mutate(cum_pct = cumsum(Pct),
         mid_pct = cum_pct - Pct/2) %>% # 堆叠块的中点位置
  ungroup() %>%
  mutate(Position_rev = fct_rev(Position)) # 反转Position顺序,匹配绘图的y轴

# 绘制图形
ggplot(dat_summary, aes(fill = factor(Subjektiver_Gesundheitszustand))) +
  # 堆叠条形图
  geom_bar(aes(x = Pct, y = Position_rev), 
           position = position_fill(reverse = TRUE), stat = "identity") +
  # 正常占比标签(>=5%):留在条形内居中
  geom_text(data = filter(dat_summary, Pct >= 0.05),
            aes(x = mid_pct, y = Position_rev, 
                label = paste0(sprintf("%1.0f", Pct * 100), "%")),
            size = 5) +
  # 小占比标签(<5%):移到条形外侧
  geom_text(data = filter(dat_summary, Pct < 0.05),
            aes(x = 1.02, y = Position_rev, 
                label = paste0(sprintf("%1.0f", Pct * 100), "%")),
            hjust = 0, size = 5) +
  # 添加连线:连接小标签与对应条形块右端
  geom_segment(data = filter(dat_summary, Pct < 0.05),
               aes(x = 1, xend = 1.01, y = Position_rev, yend = Position_rev),
               color = "gray50") +
  # 坐标轴与刻度设置
  scale_x_continuous(labels = scales::percent, expand = expansion(mult = c(0, 0.1))) + # 扩展x轴右侧空间,容纳外侧标签
  facet_wrap(vars(Position), ncol = 1, scales = "free_y") +
  # 填充色与图例设置
  scale_fill_manual(labels = c("sehr gut", "gut", "mittelmäßig", "schlecht", "sehr schlecht"), 
                    values = c("#A3E6B4","#86BD94", "#658F70","#4C6B54", "#2F4234")) +
  # 主题设置
  labs(y = "Position", x = "Percentage") +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.y = element_blank(),
        strip.background = element_rect(fill = NA),
        strip.text = element_text(hjust = 0, size = 30))

关键说明

  • 阈值调整:代码中用Pct >= 0.05区分正常和小占比,你可以根据实际情况修改阈值(比如改成0.03对应3%)。
  • x轴扩展:scale_x_continuous里的expand = expansion(mult = c(0, 0.1))用来给右侧留出空间放置外侧标签,避免被截断。
  • 连线位置:geom_segment的x从1(条形右端)到1.01(标签左侧),保持连线简洁不突兀。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:25:54