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

如何使用ggplot2设置饼图标签以避免重叠

解决ggplot2饼图标签重叠的实用方法

你的饼图标签重叠核心原因是部分类别(如count为2、6、2、3的项)占比极低,切片空间不足以容纳标签,导致挤在一起。以下是几种可行的解决思路:

1. 合并小类别(最推荐)

把占比过小的类别合并为「其他」,减少切片数量,从根源上避免小切片的标签冲突:

library(ggplot2)
library(dplyr)

df <- data.frame(
  category = LETTERS[1 : 14],
  count = c(86, 2, 6, 315, 98, 140, 48, 167, 226, 269, 2, 70, 3, 112)
)

# 将count小于10的类别合并为"其他"
df_processed <- df %>%
  mutate(category = ifelse(count < 10, "其他", category)) %>%
  group_by(category) %>%
  summarise(count = sum(count)) %>%
  ungroup()

ggplot(df_processed, aes(x = "", y = count, fill = category)) +
  geom_bar(stat = "identity", width = 1) +
  geom_text(aes(label = count), position = position_stack(vjust = 0.5)) +
  coord_polar("y", start = 0) +
  theme_void() # 移除冗余坐标轴,优化饼图视觉效果

2. 仅显示大类别标签

如果不想合并类别,可以只给占比超过阈值的类别添加标签,小类别标签隐藏:

ggplot(df, aes(x = "", y = count, fill = category)) +
  geom_bar(stat = "identity", width = 1) +
  # 仅显示count≥10的标签
  geom_text(aes(label = ifelse(count >= 10, count, "")), 
            position = position_stack(vjust = 0.5)) +
  coord_polar("y", start = 0) +
  theme_void()

3. 外部标签+连线(保留所有类别)

借助ggrepel包将小类别的标签移到饼图外部,并用连线关联,彻底避免重叠:

library(ggplot2)
library(dplyr)
library(ggrepel)

# 计算每个切片的中心位置,用于定位外部标签
df <- df %>%
  arrange(desc(category)) %>%
  mutate(prop = count / sum(count),
         ypos = cumsum(prop) - 0.5 * prop)

ggplot(df, aes(x = "", y = prop, fill = category)) +
  geom_bar(stat = "identity", width = 1) +
  # 内部显示占比≥2%的标签
  geom_text(aes(label = ifelse(prop >= 0.02, count, "")), 
            position = position_stack(vjust = 0.5)) +
  # 外部用repel显示小类别标签,避免重叠
  geom_text_repel(aes(label = ifelse(prop < 0.02, count, ""), 
                      x = 1.2, y = ypos),
                  min.segment.length = 0) + # 强制显示标签与切片的连线
  coord_polar("y", start = 0) +
  xlim(c(-1, 1.5)) # 扩展x轴范围,给外部标签预留空间

4. 改用环形图(Donut Plot)

给饼图中间挖空,增加视觉空间,让标签更易区分:

ggplot(df, aes(x = 2, y = count, fill = category)) + # 设置x=2用于形成环形
  geom_bar(stat = "identity", width = 1) +
  geom_text(aes(label = count), position = position_stack(vjust = 0.5)) +
  coord_polar("y", start = 0) +
  xlim(c(0.5, 2.5)) # 调整x轴范围,生成环形效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:06:06