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

