当前位置:  开发笔记 > 编程语言 > 正文

来自按级别分组的多索引pandas数据帧的子图

如何解决《来自按级别分组的多索引pandas数据帧的子图》经验,为你挑选了1个好方法。

我如何基于多索引的一个级别从多索引的pandas 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()

但结果并不理想,每个子情节都有不同的传说......这使得它很难阅读.必须有一种更简单的方法从多索引的数据帧中进行子图...谢谢!

EDIT1:Ted Petrou使用seaborn factorplot提出了一个很好的解决方案,但我有两个问题.我已经定义了一个样式,我宁愿不使用seaborn样式(一个解决方案可以改变seaborn的参数).另一个问题是我想使用堆积条形图,这需要相当多的额外调整.我可以用Matplotlib做类似的事吗?



1> Ted Petrou..:

在我看来,当您整理数据时,更容易进行数据分析 - 使每列代表一个变量.在这里,您有不同列中的所有4年.Pandas有一个功能和一种方法可以从宽(杂乱)数据中生成长(整洁)数据.您可以使用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)

在此输入图像描述

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有