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

使用ggplot2绘制共享同一Y轴的多变量分组条形图

解决方案:多变量堆叠百分比条形图合并(共享Y轴+独立图例)

核心思路

要实现任意数量变量的图形合并,关键是复用绘图逻辑+图形拼接:

  • 用函数封装单个变量的绘图代码,支持快速生成任意变量的图形
  • 使用patchwork包拼接图形,实现共享Y轴,同时保留每个变量的独立图例
  • 统一颜色映射,确保相同类别在不同变量中颜色一致

完整代码

1. 加载依赖包与定义颜色映射

library(ggplot2)
library(patchwork)
library(dplyr)

# 定义所有类别统一的颜色映射(覆盖Ratio/Wealthness/Cash的所有类别)
color_clrs <- c(
  A = "white", B = "black", C = "black", D = "white", 
  E = "black" # 适配Cash的E类别
)
fill_clrs <- c(
  A = "#1f3560", B = "#bfbfbf", C = "#f2f3f3", D = "#ff0000", 
  E = "#666666" # 给Cash的E分配颜色,可按需调整
)

2. 封装绘图函数

# 输入变量名和数据集,生成对应变量的堆叠百分比条形图
plot_single_var <- function(var_name, df) {
  ggplot(df, aes(Variants, fill = .data[[var_name]])) +
    # 绘制堆叠百分比条形图
    geom_bar(position = "fill") +
    # 添加计数文本,隐藏文本的颜色图例
    geom_text(stat = "count", aes(label = after_stat(count), color = .data[[var_name]]), 
              position = position_fill(vjust = 0.5), show.legend = FALSE) +
    # 反转X轴(后续coord_flip后对应Y轴顺序)
    scale_x_discrete(limits = rev) +
    # 反转Y轴并显示百分比(可选)
    scale_y_continuous(trans = "reverse", labels = scales::percent) +
    # 设置填充色与图例名称(变量名)
    scale_fill_manual(values = fill_clrs, name = var_name) +
    # 设置文本颜色
    scale_color_manual(values = color_clrs) +
    # 翻转坐标轴,让Variants作为Y轴
    coord_flip() +
    # 主题调整
    theme_classic() +
    theme(
      legend.position = "top",
      axis.ticks.x = element_blank(),
      axis.text.x = element_blank(),
      axis.title.y = element_blank(), # 去掉Y轴标题,因为共享
      plot.title = element_text(hjust = 0.5, size = 12) # 子图标题居中
    ) +
    labs(title = var_name, y = "比例")
}

3. 生成并拼接图形

# 生成每个变量的图形
p_ratio <- plot_single_var("Ratio", df1)
p_wealth <- plot_single_var("Wealthness", df1)
p_cash <- plot_single_var("Cash", df1)

# 拼接图形:3列排列,共享Y轴,保留每个变量的独立图例
p_ratio + p_wealth + p_cash +
  plot_layout(ncol = 3) +
  plot_annotation(title = "各分类变量按Variants分布", theme = theme(plot.title = element_text(hjust = 0.5, size = 14)))

扩展说明

  • 支持任意数量变量:只需新增plot_single_var("变量名", df1),然后在拼接时加入即可
  • 颜色调整:直接修改color_clrs和fill_clrs向量,新增类别时补充对应颜色即可
  • 布局调整:修改plot_layout(ncol = x)可以调整列数,比如改成ncol=1实现竖直排列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:07:00