ggplot堆叠分组分面图表调整:按会员分栏,车辆类型堆叠
ggplot分组堆叠柱状图调整方案
要实现「每个周几展示2个分栏(会员/非会员),分栏内堆叠两种车辆类型」的效果,核心是调整美学映射和位置参数,具体修改如下:
一、简化数据处理代码
原代码中创建的fill_var交互变量不再需要,直接保留聚合后的字段即可:
ea3 <- ddply(dias_semana, c("mes","weekday", "member_casual", "rideable_type"), summarise, n = sum(n)) ea3$rideable_type <- factor(ea3$rideable_type, levels = c("classic_bike", "electric_bike")) # 可选:固定会员类型的显示顺序 ea3$member_casual <- factor(ea3$member_casual, levels = c("casual", "member"))
二、调整绘图代码
修改美学映射、位置参数和图例设置,实现分栏+堆叠的组合效果:
theme_set(theme_bw(base_size = 12)) plot_diassem_m_mc = ggplot(ea3, aes(x = factor(weekday, level = c("lunes","martes","miércoles", "jueves","viernes","sábado", "domingo")), y = n, fill = rideable_type, # 用会员类型+车辆类型的交互作为分组,确保堆叠和分栏逻辑正确 group = interaction(member_casual, rideable_type))) + # 先堆叠车辆类型,再按会员类型分栏,宽度与原设置保持一致 geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.7)+ # 保留原主题设置 theme(plot.title=element_text(size=11))+ theme(axis.text.x=element_blank(), axis.ticks.x=element_blank())+ theme(axis.title=element_text(size=10))+ theme(axis.text.y=element_text(size=8))+ labs(title = "Gráfico 11. Número de viajes por cada día de la semana, según mes", x = "", y = "", fill = "Tipo de bicicleta")+ # 给图例添加明确标题 facet_wrap(~mes)+ theme(strip.text = element_text(size = 7, color = "dark green"))+ theme(legend.key.height= unit(0.2, 'cm'), legend.key.width= unit(0.3, 'cm'), legend.text = element_text(size=9))+ # 调整填充色的显示标签 scale_fill_discrete(labels=c('Bici clásica', 'Bici eléctrica'))+ # 可选:添加会员类型的标签(解决x轴隐藏后分栏识别问题) geom_text(aes(label = member_casual), position = position_dodge(width = 0.7), y = -50, # 根据你的数据范围调整这个值,避免遮挡柱状图 size = 3) print(plot_diassem_m_mc)
关键调整说明
group = interaction(member_casual, rideable_type):让ggplot识别每个周几下方的4个细分组,从而正确实现「分栏(会员/非会员)+ 堆叠(车辆类型)」的组合逻辑position = position_dodge(width = 0.7):控制会员与非会员的分栏并排显示,每个分栏内自动堆叠两种车辆类型的数值- 移除原
fill_var,直接用rideable_type作为填充映射,简化逻辑同时让图例更清晰 - 可选的
geom_text用来标注每个分栏的会员类型,解决x轴隐藏后的识别问题
内容的提问来源于stack exchange,提问作者Ivan A. Ramírez Zapata
相关产品推荐
相关产品推荐

