如何调整R语言ggplot饼图的ggrepel标签以解决重叠问题
问题原因
你的代码主要存在2个导致标签堆叠错乱的问题:
- 单独构建的标签表做了
arrange(perc)排序,导致生成的百分比标签和原属类的顺序不匹配,标签和饼块对应关系完全错乱 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
相关产品推荐
相关产品推荐

