如何创建以某列值为高度、另一列比例填充的Pandas堆叠条形图?
实现按Campaign占比填充的Decile转化条形图
原始数据
import pandas as pd df = pd.DataFrame({'decile': [1,1,2,2,2,3,3,3], 'conversion': [.3,.3,.5,.5,.5,.55,.55,.55], 'campaign': ['tv','online','tv','online','radio','tv','online','radio'], 'campaign_pct': [.6,.4,.5,.4,.1,.45,.35,.2]})
数据预览:
| decile | conversion | campaign | campaign_pct |
|---|---|---|---|
| 1 | 0.30 | tv | 0.60 |
| 1 | 0.30 | online | 0.40 |
| 2 | 0.50 | tv | 0.50 |
| 2 | 0.50 | online | 0.40 |
| 2 | 0.50 | radio | 0.10 |
| 3 | 0.55 | tv | 0.45 |
| 3 | 0.55 | online | 0.35 |
| 3 | 0.55 | radio | 0.20 |
需求说明
创建条形图,以decile为X轴,每个条形总高度对应conversion值;条形内部按campaign_pct的比例,用不同颜色填充对应campaign的分段,最终每个Decile的条形被拆分为多个Campaign的颜色块,总高度等于该Decile的转化值。
解决方案代码
import matplotlib.pyplot as plt # 计算每个Campaign分段的实际高度:转化值 × 该Campaign的占比 df['segment_height'] = df['conversion'] * df['campaign_pct'] # 将长格式数据转为宽格式,方便绘制堆叠条形图 pivot_df = df.pivot(index='decile', columns='campaign', values='segment_height').fillna(0) # 绘制堆叠条形图 ax = pivot_df.plot(kind='bar', stacked=True, figsize=(8, 6), colormap='viridis') # 设置图表标签与标题 ax.set_xlabel('Decile') ax.set_ylabel('Conversion') ax.set_title('Conversion by Decile (Split by Campaign)') # 调整图例与布局 ax.legend(title='Campaign') plt.tight_layout() plt.show()
代码说明
- 先通过
conversion * campaign_pct计算每个Campaign分段的实际高度,确保同一Decile下所有分段高度之和等于该Decile的转化值 - 用
pivot转换数据格式,让每个Campaign作为单独列,适配matplotlib的堆叠条形图绘制逻辑 stacked=True参数启用堆叠模式,同一X轴位置的分段会自动叠加- 可通过
colormap参数替换配色方案,比如换成tab10、coolwarm等
内容的提问来源于stack exchange,提问作者Gaurav Bansal
相关产品推荐
相关产品推荐

