如何修改pandas.DataFrame.plot()堆叠柱状图的显示行为?
问题描述
我用pandas的pd.DataFrame.plot方法绘制由.describe()生成的分位数表格,代码如下:
test = dict(df.groupby('symbol')['growth_%'].describe()) testdf = pd.DataFrame().from_dict(test) testdf[['25%', '50%', '75%']].plot(kind='bar', stacked=True, figsize=(10, 6));
当前50%分位数会因正负值分别叠加在25%分位数下方或75%分位数下方,导致柱状图长度受求和影响。我希望50%分位数始终处于25%和75%分位数中间,且不影响两者的柱状图长度,类似将其放在次坐标轴上。请问能否通过df.plot()实现该需求,还是需单独绘制次坐标轴?
解决方案
直接用df.plot()的堆叠柱状图无法实现你要的效果——堆叠逻辑本质是数值累加,正负值会互相抵消或叠加,必然影响柱状图长度。必须通过单独绘制次坐标轴来达成需求,具体实现步骤如下:
- 先绘制25%和75%的分组柱状图(不使用堆叠),用来展示分位数的区间范围:
ax = testdf[['25%', '75%']].plot(kind='bar', figsize=(10, 6), width=0.6)
- 创建次坐标轴,绘制50%分位数的散点(用散点比折线更能突出中位数的位置):
ax2 = ax.twinx() testdf['50%'].plot(kind='scatter', ax=ax2, color='red', marker='o', s=100, zorder=5)
- 调整图表样式,提升可读性:
# 设置坐标轴标签 ax.set_ylabel('25%/75% 分位数') ax2.set_ylabel('50% 分位数') # 配置图例位置 ax.legend(['25%', '75%'], loc='upper left') ax2.legend(['50%'], loc='upper right') # 对齐主次坐标轴范围,让中位数点落在25%和75%的视觉区间内 ax2.set_ylim(ax.get_ylim())
这样处理后,25%和75%的柱状图长度不受任何影响,50%分位数的点会精准对应每个symbol的位置,且视觉上处于两者的区间中间,完全符合你的需求。
内容的提问来源于stack exchange,提问作者niche97
相关产品推荐
相关产品推荐

