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

如何用Pandas和Matplotlib实现分组堆叠柱状图?

实现分组堆叠柱状图的解决方案

要实现每个类别下3个堆叠柱状图(每个堆叠展示Month1和Month2的占比),你需要调整数据处理逻辑和绘图方式,核心是按销售阶段(Sale1/Sale2/Sale3)分组,在每个类别下并排展示这三个阶段的柱子,每个柱子内部堆叠对应Month的数值。以下是具体实现步骤和代码:

步骤1:数据格式转换

首先把原宽表数据转成长表,方便按Sale和Month维度筛选:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

data = {
    'Categories': ['Opel', 'Audi', 'Lamborgini', 'McLaren'],
    'Sale1': [60, 50, 40, 10],
    'Sale2': [70, 10, 5, 30],
    'Sale3': [5, 12, 20, 50],
    'Month': [1, 1, 2, 2],
}
df = pd.DataFrame(data)

# 转成长表格式,方便按Sale和Month处理
df_melt = df.melt(id_vars=['Categories', 'Month'], var_name='Sale', value_name='Value')

步骤2:绘制分组堆叠柱状图

通过手动控制x轴位置和bottom参数实现堆叠效果,确保同一类别下的三个Sale柱子并排,每个柱子内部堆叠Month1和Month2:

fig, ax = plt.subplots(figsize=(12, 6))

# 定义Month对应的颜色
color_month1 = '#98abc5'
color_month2 = '#8a89a6'
# 柱子宽度
bar_width = 0.25
# 获取类别和销售阶段的唯一值
categories = df['Categories'].unique()
sales = ['Sale1', 'Sale2', 'Sale3']
# 基础x轴位置
x = np.arange(len(categories))

# 遍历每个销售阶段,绘制堆叠柱
for idx, sale in enumerate(sales):
    # 筛选当前销售阶段的数据,并按类别和Month整理
    sale_data = df_melt[df_melt['Sale'] == sale]
    sale_pivot = sale_data.pivot(index='Categories', columns='Month', values='Value').reindex(categories)
    
    # 绘制Month1的柱(底层)
    ax.bar(x + idx * bar_width, sale_pivot[1], width=bar_width, 
           label=f'{sale} - Month1' if idx == 0 else "", color=color_month1)
    # 绘制Month2的柱(堆叠在Month1上方)
    ax.bar(x + idx * bar_width, sale_pivot[2], width=bar_width, bottom=sale_pivot[1],
           label=f'{sale} - Month2' if idx == 0 else "", color=color_month2)

# 配置图表标签和刻度
ax.set_xticks(x + bar_width)  # 让x轴标签对齐每个类别中心
ax.set_xticklabels(categories)
ax.set_xlabel('品牌类别')
ax.set_ylabel('销售额')
ax.set_title('品牌-销售阶段-月度销售额分组堆叠柱状图')

# 整理图例,避免重复
handles, labels = ax.get_legend_handles_labels()
unique_legends = dict(zip(labels, handles))
ax.legend(unique_legends.values(), unique_legends.keys(), bbox_to_anchor=(1.05, 1), loc='upper left')

plt.tight_layout()
plt.show()

关键逻辑说明

  • 原代码是按Month分组绘制并排柱,而我们需要按Sale阶段分组,每个Sale阶段对应一个堆叠柱,放在同一类别下的对应位置。
  • 使用bottom参数实现堆叠:Month2的柱子底部对齐Month1柱子的顶部,形成堆叠效果。
  • 通过x + idx * bar_width控制每个Sale阶段的x轴偏移,确保同一类别下的三个柱子并排不重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:24:52