来自按级别分组的多索引熊猫数据框的子图

纳布拉

如何基于多索引级别之一从多索引熊猫DataFrame进行多个绘图?

我有一个模型的结果,该模型在不同情况下使用了不同的技术,结果可能看起来像这样:

import numpy as np
import pandas as pd
df=pd.DataFrame(abs(np.random.randn(12,4)),columns=[2011,2012,2013,2014])
df['scenario']=['s1','s1','s1','s2','s2','s3','s3','s3','s3','s4','s4','s4']
df['technology'=['t1','t2','t5','t2','t6','t1','t3','t4','t5','t1','t3','t4']
dfg=df.groupby(['scenario','technology']).sum().transpose()

dfg将在每种情况下每年采用的技术。我想为每个共享图例的场景创建一个子图。

如果我仅使用参数subplots = True,那么它将绘制所有可能的组合(12个子图)

dfg.plot(kind='bar',stacked=True,subplots=True)

基于此响应,我可以更接近所需的内容。

f,a=plt.subplots(2,2)

fig1=dfg['s1'].plot(kind='bar',ax=a[0,0])

fig2=dfg['s2'].plot(kind='bar',ax=a[0,1])

fig2=dfg['s3'].plot(kind='bar',ax=a[1,0])

fig2=dfg['s3'].plot(kind='bar',ax=a[1,1])

plt.tight_layout()

但是结果并不理想,每个子图都有不同的图例...这使得它很难阅读。必须有一种更容易的方法来对多索引数据框进行子图绘制...谢谢!

编辑1:泰德·彼得鲁(Ted Petrou)使用seaborn factorplot提出了一个不错的解决方案,但我有两个问题。我已经定义了样式,我不希望使用seaborn样式(一种解决方案是更改seaborn的参数)。另一个问题是我想使用堆积条形图,这需要进行大量额外的调整我有可能用Matplotlib做类似的事情吗?

特德·彼得鲁(Ted Petrou)

我认为,当您“整理”数据时,进行数据分析会更容易-使每一列代表一个变量。在这里,您用不同的列表示所有4年。熊猫具有一种从宽(混乱)数据中生成长(整齐)数据的功能和一种方法。您可以使用df.stackpd.melt(df)整理数据。然后,您可以利用出色的seaborn库,该库期望整洁的数据可以轻松地绘制您想要的大多数内容。

整理数据

df1 = pd.melt(df, id_vars=['scenario', 'technology'], var_name='year')
print(df1.head())

  scenario technology  year     value
0       s1         t1  2011  0.406830
1       s1         t2  2011  0.495418
2       s1         t5  2011  0.116925
3       s2         t2  2011  0.904891
4       s2         t6  2011  0.525101

使用Seaborn

import seaborn as sns
sns.factorplot(x='year', y='value', hue='technology', 
               col='scenario', data=df1, kind='bar', col_wrap=2,
              sharey=False)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章