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

ggplot中geom_col(position="fill")下geom_text_repel标签垂直避让问题

问题解决方法

你遇到的错误是因为geom_text_repel不允许同时使用position参数和nudge_x/nudge_y参数。要在position="fill"的柱状图中实现标签不与填充色重叠,你可以手动计算每个填充分段的中点位置,然后基于这些位置放置标签并添加偏移。

以下是修正后的代码:

library(tidyverse)
library(cowplot)
library(ggrepel)

# 预处理数据,计算每个颜色分段的中点位置
diamonds_processed <- diamonds %>% 
  count(cut, color) %>% 
  filter(cut == "Fair") %>% 
  mutate(
    lab = paste0(color, " (n = ", n, ")"),
    color = fct_reorder(color, n),
    # 计算每个颜色占总数量的比例
    prop = n / sum(n),
    # 累计比例,用于确定分段的堆叠位置
    cum_prop = cumsum(prop),
    # 计算每个分段的中点(填充部分的中心位置)
    mid_point = cum_prop - prop / 2
  )

# 绘制图表
ggplot(diamonds_processed, aes(y = cut, x = n, fill = color)) +
  geom_col(position = "fill") +
  geom_text_repel(
    aes(x = mid_point, label = lab, color = color),
    direction = "x",  # 仅在水平方向上调整标签位置
    nudge_x = 0.03,   # 将标签向右偏移,避免与柱状图重叠
    hjust = 0,        # 标签左对齐
    size = 3.5
  ) +
  # 可选:将X轴格式化为百分比
  scale_x_continuous(labels = scales::percent_format()) +
  theme_cowplot()

关键调整说明

  1. 手动计算中点:通过prop(比例)、cum_prop(累计比例)和mid_point(中点),我们得到了每个填充分段在0-1刻度上的中心位置,替代了position="fill"对文本位置的自动计算。
  2. 使用中点定位标签:在geom_text_repel中直接将x映射到mid_point,这样就可以合法使用nudge_x参数来偏移标签。
  3. 优化标签对齐:direction="x"确保标签仅在水平方向避让,hjust=0让标签在偏移后保持左对齐,避免排版混乱。

这样调整后,标签颜色会与填充色一致,同时不会与柱状图的填充区域重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:08:13