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

如何用ggplot为堆叠柱状图添加自定义标注(附R语言示例代码)

为ggplot堆叠柱状图添加自定义标注

最近开始学习R语言,需要给用ggplot绘制的堆叠柱状图添加自定义标注(目标效果类似图2),当前实现代码如下:

library(tidyverse) 

data <- data.frame(
  quarter=c("Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q3", "Q3", "Q3"),
  product=c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
  profit=c(10, 12, 13, 10, 12, 13, 10, 12, 0)
)

p <- ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col(position = 'fill') 
p

当前生成的是默认的百分比堆叠柱状图(图1),要实现图2的自定义标注效果,可按以下步骤处理:

1. 预处理数据,计算标注位置与文本

首先按季度分组,计算每个产品利润的占比、堆叠块的中心位置,同时处理利润为0的特殊标注文本:

data_processed <- data %>%
  group_by(quarter) %>%
  mutate(
    total_profit = sum(profit),
    pct = profit / total_profit,
    # 计算堆叠块的中心位置,用于放置标注
    y_pos = cumsum(pct) - pct / 2,
    # 自定义标注文本:利润为0时显示“无数据”,否则显示利润数值
    label_text = ifelse(profit == 0, "无数据", as.character(profit))
  ) %>%
  ungroup()

2. 绘制带自定义标注的堆叠柱状图

基于预处理后的数据绘制图表,添加标注并优化样式:

p <- ggplot(data_processed, aes(x = quarter, y = pct, fill = product)) +
  geom_col() +
  # 添加自定义标注,设置白色字体提升可读性
  geom_text(aes(y = y_pos, label = label_text), color = "white", size = 4) +
  # 将Y轴转换为百分比格式,匹配堆叠占比逻辑
  scale_y_continuous(labels = scales::percent_format()) +
  # 设置坐标轴与图例标签
  labs(x = "季度", y = "利润占比", fill = "产品") +
  # 选用简洁主题
  theme_minimal()

p

代码说明

  • 通过group_by(quarter)分组计算,确保每个季度内的占比计算准确;
  • y_pos的计算让标注精准落在每个堆叠块的中心位置;
  • 用ifelse处理利润为0的特殊情况,替换成指定文本;
  • 调整Y轴为百分比格式,与position='fill'的原始效果一致,同时优化了图表的可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:30:51