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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:04:53