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

如何基于给定DataFrame创建日期为Y轴的百分比堆叠条形图

实现以日期为Y轴的百分比堆叠条形图

步骤说明

  1. 数据预处理: 计算每个日期的总销量,再推导各产品组的销量占比
  2. 数据重塑: 将长格式数据转为宽格式(日期为行、产品组为列),适配堆叠绘图的结构需求
  3. 绘制横向堆叠条形图: 用Matplotlib的barh函数实现堆叠效果,配置坐标轴格式与图例

完整代码示例

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter

# 1. 创建示例DataFrame
data = {
    'date': ['2021-10-01', '2021-10-01', '2021-10-01', '2021-11-11', '2021-12-12'],
    'product_group': ['A', 'C', 'Z', 'A', 'B'],
    'quantity': [10, 10, 80, 13, 5]
}
df = pd.DataFrame(data)

# 2. 计算每日总销量及各产品组占比
df['daily_total'] = df.groupby('date')['quantity'].transform('sum')
df['percentage'] = df['quantity'] / df['daily_total']

# 3. 转换为宽格式数据,缺失组填充0
pivot_df = df.pivot(index='date', columns='product_group', values='percentage').fillna(0)

# 4. 绘制横向堆叠条形图
plt.figure(figsize=(10, 6))
y_pos = range(len(pivot_df.index))
bottom = [0] * len(pivot_df.index)

# 循环绘制每个产品组的堆叠部分
for group in pivot_df.columns:
    plt.barh(y_pos, pivot_df[group], left=bottom, label=group)
    # 更新堆叠起点
    bottom = [b + val for b, val in zip(bottom, pivot_df[group])]

# 配置图表元素
plt.yticks(y_pos, pivot_df.index)
plt.xlabel('销量占比')
plt.ylabel('日期')
plt.title('各日期产品组销量百分比堆叠图')
# 将X轴转为百分比格式
plt.gca().xaxis.set_major_formatter(PercentFormatter(1))
plt.legend(title='产品组')
plt.tight_layout()
plt.show()

关键细节说明

  • 用groupby+transform批量计算每日总销量,避免循环,效率更高
  • pivot后用fillna(0)处理无数据的产品组,确保堆叠结构完整
  • 通过更新left参数的bottom列表,实现条形的堆叠效果
  • PercentFormatter(1)将0-1的小数直接转为百分比显示,无需额外乘100

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:30:11