R语言饼图如何调整扇区标签角度与扇区同向以避免重叠
R ggplot饼图标签同向调整解决方案
核心修改逻辑
- 修正原始数据构造的语法问题,先构建标准数据框
- 新增标签角度计算列,根据扇区位置自动匹配同向角度,同时调整左侧扇区标签方向避免文字倒转
- 外移标签位置并扩展x轴范围,解决标签溢出问题
- 搭配ggrepel组件自动优化重叠标签的位置
完整可运行代码
首先加载依赖包:
library(tidyverse) library(ggrepel)
构造数据集并绘图:
# 构造示例数据 df <- data.frame( Var1 = c("really long label", "another really long label", "this is a long placeholder", "I need a better imagination", "Thanks in advance for your help"), Freq = c(548, 326, 292, 199, 138) ) df %>% mutate(perc = scales::percent(Freq/sum(Freq))) %>% # 排序逻辑要和饼图展示顺序一致,避免角度对应错误 arrange(desc(Var1)) %>% mutate( pos = cumsum(Freq) - Freq/2, # 计算标签基础角度,匹配coord_polar start=0时顶部为起点的规则 angle = 90 - pos / sum(Freq) * 360, # 调整左侧扇区角度,避免文字倒转影响阅读 angle = ifelse(angle < -90, angle + 180, angle) ) %>% ggplot(aes(x = "", y = Freq, fill = factor(Var1) )) + geom_bar(width = 1, stat = "identity") + coord_polar("y", start = 0) + # 百分比标签用repel避免重叠 ggrepel::geom_label_repel( aes(x = 1.2, y = pos, label = perc), size = 4, show.legend = F ) + ggtitle("Male") + # 分类标签绑定计算好的角度参数,外移位置避免挤压 geom_text( aes(x = 1.3, y = pos, label = Var1, angle = angle), size = 3.5, show.legend = F ) + theme(legend.position="none") + # 扩展x轴范围容纳外侧长标签 xlim(c("", 1.5))
额外优化说明
如果调整后仍有轻微标签重叠,可做以下调整:
- 适当调小
geom_text的size参数 - 将普通
geom_text替换为geom_text_repel,保留angle参数即可继承防重叠逻辑 - 若标签长度差异过大,可拆分过长标签为两行显示
内容的提问来源于stack exchange,提问作者Macromind101
相关产品推荐
相关产品推荐

