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

如何修改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()的堆叠柱状图无法实现你要的效果——堆叠逻辑本质是数值累加,正负值会互相抵消或叠加,必然影响柱状图长度。必须通过单独绘制次坐标轴来达成需求,具体实现步骤如下:

  1. 先绘制25%和75%的分组柱状图(不使用堆叠),用来展示分位数的区间范围:
ax = testdf[['25%', '75%']].plot(kind='bar', figsize=(10, 6), width=0.6)
  1. 创建次坐标轴,绘制50%分位数的散点(用散点比折线更能突出中位数的位置):
ax2 = ax.twinx()
testdf['50%'].plot(kind='scatter', ax=ax2, color='red', marker='o', s=100, zorder=5)
  1. 调整图表样式,提升可读性:
# 设置坐标轴标签
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:47:12