如何基于给定DataFrame创建日期为Y轴的百分比堆叠条形图
实现以日期为Y轴的百分比堆叠条形图
步骤说明
- 数据预处理: 计算每个日期的总销量,再推导各产品组的销量占比
- 数据重塑: 将长格式数据转为宽格式(日期为行、产品组为列),适配堆叠绘图的结构需求
- 绘制横向堆叠条形图: 用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
相关产品推荐
相关产品推荐

