簡體   English   中英

來自按級別分組的多索引pandas數據幀的子圖

[英]subplots from a multiindex pandas dataframe grouped by level

我如何基於多索引的一個級別從多索引的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做類似的事嗎?

在我看來,當您整理數據時,更容易進行數據分析 - 使每列代表一個變量。 在這里,您有不同列中的所有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)

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM