我可以更改pandas.DataFrame.plot()堆叠条形图行为吗?

rryofs0p  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(86)

在pandas中,我使用标准的pd.DataFrame.plot方法绘制了下面的.describe()表:

编辑:CSV原始数据:https://drive.google.com/file/d/1uQltao5atGgFFIkyiicHclpd7sHcduwf/view?usp=sharing
并且输出:

我使用的代码是:

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个百分位值。现在,如果值小于0,它将标记自己低于第25个百分位值,或者如果大于0,它将标记自己低于第75个百分位值。
我希望第50百分位数始终处于2个值的中间,并且最好实际上不影响条的长度-也就是说,通过求和,不会使第25百分位数值看起来更低或第75百分位数值看起来更高。
我知道这就是堆叠条形图的本质,我想问的更像是在第二个y轴上有第50个百分位数,所以它实际上不会影响其他条形图。有没有一种方便的方法可以从df.plot()方法中生成我所描述的内容?或者我需要创建一个第二个y轴并单独绘制第50个百分位数?

9udxz4iz

9udxz4iz1#

IIUC,您可以更改系列的顺序,以如下方式绘制:

test = dict(df.groupby('symbol')['growth_%'].describe())
testdf = pd.DataFrame().from_dict(test)
testdf[['50%', '25%', '75%']].plot(kind='bar', stacked=True, figsize=(10, 6));

输出:

度假胜Map例:

test = dict(df.groupby('symbol')['growth_%'].describe())
testdf = pd.DataFrame().from_dict(test)
ax = testdf[['50%', '25%', '75%']].plot(kind='bar', stacked=True, figsize=(10, 6));
lh = ax.get_legend_handles_labels()
lz = list(zip(*sorted(zip(*lh), key=lambda x: x[1])))
ax.legend(*lz)

输出:

最后,对于重叠且不堆叠的条:

test = dict(df.groupby('symbol')['growth_%'].describe())
testdf = pd.DataFrame().from_dict(test)
#ax = testdf[['50%', '25%', '75%']].plot.bar(figsize=(10, 6));
l1 = plt.bar(testdf.index, testdf['25%'])
l2 = plt.bar(testdf.index, testdf['75%'])
l3 = plt.bar(testdf.index, testdf['50%'])
plt.xticks(rotation=90)
plt.legend([l1,l3,l2],['25%', '50%', '75%' ])

输出:

相关问题