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

