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
相关产品推荐
相关产品推荐

