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

使用ggplot2/ggrepel绘制饼图:如何让长标签全部显示在外部

解决饼图长标签显示在内部的问题

原代码在短标签场景下运行正常,但长标签会被挤压到饼图内部,可通过以下调整确保所有标签显示在外部:

修改后的完整代码

library(ggplot2)
library(ggrepel)
library(stringr) # 加载stringr处理标签长度

df <- data.frame(
  group = c("Antelope", "Bird", "Cat a longer label", "Dog", "Eel a longer label"),
  value = c(25, 25, 50, 1, 1)
)

df$group <- factor(df$group, levels = rev(df$group))

window <- function(x) {
  n <- length(x)
  res <- vector(length = n - 1)
  for (i in seq(n - 1)) {
    res[i] <- (x[i] + x[i+1]) / 2
  }
  return(res)
}

df$pos <- window(cumsum(c(0, df$value)))

ggplot(df, aes(x = "", y = value, fill = group))+
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y", start = 0) +
  geom_text_repel(
    aes(y = pos, x = 1.2 + str_length(group)/20, label = group), # 动态x值适配标签长度
    size = 5,
    nudge_x = 0.5, # 统一向外偏移
    direction = "y", # 限制标签仅垂直方向调整
    min.segment.length = 0, # 强制显示连接线
    force = 2 # 增加标签间的排斥力
  ) +
  guides(fill = "none") +
  scale_fill_viridis_d() +
  theme_void()

关键调整说明

  • 动态计算x坐标:通过str_length(group)获取标签长度,给长标签分配更大的x值,预留足够的外部显示空间
  • 限制调整方向:direction = "y"避免标签向饼图中心方向偏移
  • 优化偏移与连接线:nudge_x = 0.5确保所有标签向外偏移,min.segment.length = 0强制显示连接线,让短标签也能清晰关联到对应扇区
  • 增强排斥力:force = 2减少长标签之间的重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:07:39