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

Posted

技术标签:

【中文标题】来自按级别分组的多索引熊猫数据框的子图【英文标题】:subplots from a multiindex pandas dataframe grouped by level 【发布时间】:2017-06-08 06:10:27 【问题描述】:

我如何根据多索引的一个级别从多索引熊猫数据帧中进行多重绘图?

我有一个模型在不同场景中使用不同技术的结果,结果可能如下所示:

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)

基于this response,我离我想要的更近了。

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 的参数)。另一个问题是我想使用堆积条形图,这需要相当多的extra tweaks。我有机会用 Matplotlib 做类似的事情吗?

【问题讨论】:

如果您以这种方式导入 seaborn,则可以在没有 seaborn 样式的情况下使用 seaborn 绘图函数:import seaborn.apionly as sns 【参考方案1】:

在我看来,当您“整理”数据时,进行数据分析会更容易——让每一列代表一个变量。在这里,您将所有 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)

【讨论】:

我比我更喜欢这个答案。 整理数据确实是个好建议!我有点不愿意使用 seaborn,因为我在报告中有几个数字,我希望它们都具有相同的样式(颜色、字体大小......)。有没有办法对 matplotlib/pandas 做同样的事情?或者,更改 seaborn 样式参数,使其匹配特定的 matplotlib 样式? 请注意,较新的版本会抛出 UserWarning:factorplot 函数已重命名为 catplot。由于编辑队列已满,我无法编辑答案

以上是关于来自按级别分组的多索引熊猫数据框的子图的主要内容,如果未能解决你的问题,请参考以下文章

来自另一个数据框的熊猫多索引分配

访问熊猫数据框中内部多索引级别的最后一个元素

按对象将熊猫分组转换为多索引数据框

在多索引熊猫数据框的第二级填充 NaN

将熊猫多索引切片彼此分开

熊猫添加更高级别的列多索引