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

R ggplot2如何不转换长格式绘制多列对应独立堆叠百分比柱状图?

解决方案

可以不转换为长格式实现需求,核心思路是为每一个指标列单独定义geom_bar图层,手动指定不同的x轴位置,所有图层共享Y轴即可实现并排的百分比堆叠柱效果。

基础实现代码(适配你的示例数据)

library(ggplot2)
library(scales)

ggplot(data = data) +  
  # 绘制metric1的百分比堆叠柱,x轴位置固定为1
  geom_bar(aes(x = 1, group = factor(metric1), fill = factor(metric1)), 
           position = "fill") + 
  # 绘制metric2的百分比堆叠柱,x轴位置固定为2
  geom_bar(aes(x = 2, group = factor(metric2), fill = factor(metric2)), 
           position = "fill") + 
  # 绘制metric3的百分比堆叠柱,x轴位置固定为3
  geom_bar(aes(x = 3, group = factor(metric3), fill = factor(metric3)), 
           position = "fill") + 
  # 自定义x轴刻度,替换为指标名称
  scale_x_continuous(breaks = c(1, 2, 3), 
                     labels = c("metric1", "metric2", "metric3"),
                     name = "指标类别") +
  # Y轴转为百分比格式
  scale_y_continuous(labels = percent, name = "占比") +
  # 统一图例名称
  labs(fill = "指标取值")

多指标批量实现代码

如果你的实际数据中指标数量很多,可以批量生成图层避免重复编码:

library(ggplot2)
library(scales)

# 定义所有需要绘制的指标列名
metrics <- c("metric1", "metric2", "metric3")
# 批量生成每个指标对应的geom_bar图层
plot_layers <- lapply(seq_along(metrics), function(i) {
  geom_bar(aes(x = !!i, 
               group = factor(.data[[metrics[i]]]), 
               fill = factor(.data[[metrics[i]]])),
           position = "fill")
})

# 组合图层绘图
ggplot(data = data) +
  plot_layers +
  scale_x_continuous(breaks = seq_along(metrics), 
                     labels = metrics, 
                     name = "指标类别") +
  scale_y_continuous(labels = percent, name = "占比") +
  labs(fill = "指标取值")

补充说明

  • 该方法完全不需要修改原始数据结构,所有操作都在绘图图层层面完成。
  • 如果不同指标的取值需要统一填充色对应相同数值,可以手动添加scale_fill_manual指定颜色映射规则即可。
  • 如果需要保留原始date字段作为分组维度,可以在x轴映射中加入date的分组逻辑,适配多日期的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:45:04