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

如何在ggplot2水平堆叠条形图的负向条形顶部添加标签

解决水平堆叠条形图负数值条形的百分比标签精准定位问题

核心思路

不要依赖固定的hjust参数统一调整所有标签位置,而是针对需要显示标签的行单独定位,结合偏移量让标签精准落在负数值条形的外侧(水平图中的侧边)。

具体实现代码

library(ggplot2)

# 示例数据集
tmp <- structure(list(order = c("John", "John", "John", "Ross", "Ross", 
"Ross", "John", "John", "John", "Ross", "Ross", "Ross"), value = c(39, 
40, 13, 19, 13, 15, -12, -3, 0, -4, -1, 0), Category = c("VU", 
"EN", "CR", "VU", "EN", "CR", "VU", "EN", "CR", "VU", "EN", "CR"
), perc = c(NA, NA, NA, NA, NA, NA, NA, "14%", NA, NA, "9.6%", 
NA)), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 25L, 26L, 27L, 28L, 
29L, 30L), class = "data.frame")

# 绘制带精准标签的水平堆叠条形图
ggplot(tmp, aes(y = order, x = value, fill = Category)) +
  geom_col(position = "stack") +
  # 添加百分比标签
  geom_text(
    data = subset(tmp, !is.na(perc)), # 仅筛选有百分比数据的行
    aes(label = perc),
    x = subset(tmp, !is.na(perc))$value, # 标签定位到对应条形的端点
    hjust = 1.2, # 让标签向条形外侧(左方)偏移,数值可按需调整
    color = "black",
    size = 4
  ) +
  labs(x = "数值", y = "姓名", fill = "类别") +
  theme_minimal()

替代方案(用固定偏移量)

如果觉得hjust的偏移逻辑不好把控,可以改用nudge_x设置固定偏移量,让标签在条形端点基础上向左移动:

# 修改geom_text部分
geom_text(
  data = subset(tmp, !is.na(perc)),
  aes(label = perc),
  x = subset(tmp, !is.na(perc))$value,
  nudge_x = -0.5, # 向左偏移0.5个单位,可根据条形宽度调整
  color = "black",
  size = 4,
  hjust = 0.5 # 标签居中对齐
)

关键说明

  1. 通过subset(tmp, !is.na(perc))精准筛选需要显示标签的行,避免无效标签。
  2. 用x = subset(tmp, !is.na(perc))$value让标签定位到对应条形的端点位置,确保和条形长度匹配。
  3. 两种偏移方式(hjust或nudge_x)都能实现标签在负数值条形外侧的精准显示,可根据实际图形效果调整参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:57:09