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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:48:02