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

如何用R复现Python绘制的组合式分组填充柱状图?

合并ggplot2分面柱状图为单图的解决方案

你需要将原代码中按vs分面的两个图表合并为一个,核心是将vs作为x轴的分组维度,让每个carb类别下对应vs的两个子分组,同时保留am的填充堆叠百分比。以下是两种实现方式:

方法1:预处理数据后绘图(推荐)

先通过dplyr计算每个carb-vs组内am的占比,再用ggplot2绘制,逻辑更清晰易维护:

library(tidyverse)
library(scales)

# 预处理数据,计算组内百分比
mtcars_processed <- mtcars %>%
  mutate(
    carb = as.factor(carb),
    am = as.factor(am),
    vs = as.factor(vs)
  ) %>%
  count(carb, vs, am) %>%
  group_by(carb, vs) %>%
  mutate(pct = n / sum(n)) %>%
  ungroup()

# 绘制合并后的图表
ggplot(mtcars_processed, aes(x = carb, y = pct, fill = am)) +
  geom_col(aes(group = vs), position = position_dodge(width = 0.8), width = 0.7) +
  scale_y_continuous(labels = percent) +
  labs(x = "carb", y = "百分比", fill = "am") +
  theme(legend.position = "bottom")

方法2:直接在ggplot中计算百分比

如果不想预处理数据,可直接利用ggplot的统计变量计算,逻辑与原代码保持一致:

library(tidyverse)
library(scales)

mtcars %>%
  mutate(
    carb = as.factor(carb),
    am = as.factor(am),
    vs = as.factor(vs)
  ) %>%
  ggplot(aes(x = carb, fill = am)) +
  geom_bar(
    aes(
      y = ..count../tapply(..count.., interaction(carb, vs), sum)[interaction(carb, vs)],
      group = vs
    ),
    position = position_dodge(width = 0.8),
    width = 0.7
  ) +
  scale_y_continuous(labels = percent) +
  theme(legend.position = "bottom")

关键说明

  • 两种方式均将vs从分面转为x轴分组,每个carb下会显示两个柱子(对应vs=0和vs=1)。
  • 柱子内部按am填充,高度为该carb-vs组内am类别的百分比(总和为100%)。
  • 可通过调整position_dodge和width参数控制柱子的间距与宽度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:34:50