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

如何调整R语言ggplot饼图的ggrepel标签以解决重叠问题

问题原因

你的代码主要存在2个导致标签堆叠错乱的问题:

  1. 单独构建的标签表做了arrange(perc)排序,导致生成的百分比标签和原属类的顺序不匹配,标签和饼块对应关系完全错乱
  2. geom_label_repel的位置参数设置不合理,没有适配极坐标下的标签向外拉伸逻辑

修改后的可运行代码

library(tidyverse)
library(ggrepel)

generaabundance2020 <- c(883, 464, 1948, 1177, 2607, 962, 2073, 620, 2670)
genera2020 <-  c("Andrena", "Ceratina", "Halictus", 
                 "Hesperapis", "Lasioglossum", "Melissodes", 
                 "Osmia", "Panurginus", "Other")
generabreakdown2020 <- data.frame(group = genera2020, value = generaabundance2020)

# 直接在原数据集计算百分比标签,避免排序错位
generabreakdown2020 <- generabreakdown2020 %>%
  mutate(perc = value / sum(value),
         labels = scales::percent(perc, accuracy = 0.1))

generabreakdown2020 %>%
  ggplot(aes(x = 1, y = value, fill = group)) +
  geom_col(color = "white") + 
  coord_polar("y", start = 0) +
  theme_void() +
  # 调整标签位置,x设为1.5向外拉伸,用position_stack保证标签和饼块对应
  geom_label_repel(aes(x = 1.5, label = labels), 
                   position = position_stack(vjust = 0.5), 
                   size = 4, show.legend = F, 
                   max.overlaps = 20,
                   nudge_x = 0.3) +
  # 调整x轴范围,给标签留足够空间
  xlim(0.5, 2) +
  guides(fill = guide_legend(title = "Genera")) +
  scale_fill_manual(values = c("brown1", "chocolate1",
                               "darkgoldenrod1", "darkgreen",
                               "deepskyblue", "darkslateblue",
                               "darkorchid4", "hotpink1",
                               "lightpink"))

额外优化建议

  • 如果标签仍有轻微重叠,可以适当调小size参数,或者调大nudge_x和x轴上限
  • 也可以将属名和百分比合并为同一个标签,直接去掉右侧图例,进一步节省空间
  • 占比差距过大的场景也可以换成条形图展示,可读性会比饼图更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:15:03