如何根据多索引的一个级别从多索引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)
基于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()
但结果并不理想,每个子情节都有不同的图例..
编辑1:Ted Petrou提出了一个很好的解决方案,使用seaborn factorplot,但我有两个问题。我已经定义了一个样式,我宁愿不使用seaborn样式(一个解决方案可以改变seaborn的参数)。另一个问题是,我想使用堆叠条形图,这需要相当多的extra tweaks。我可以用Matplotlib做类似的事情吗?
2条答案
按热度按时间mctunoxg1#
在我看来,当你“整理”你的数据时,做数据分析会更容易--让每一列代表一个变量。你有所有4年表示在不同的列. Pandas有一个函数和一个方法,使长(整洁)的数据从宽(混乱)数据。你可以使用
df.stack
或pd.melt(df)
来整理你的数据。然后你可以利用优秀的seaborn库,它期望整洁的数据来轻松地绘制你想要的任何东西。整理数据
使用Seaborn
wkftcu5l2#
实现答案-factorplot函数已重命名为catplot()。这里有一个Seaborn documentation的链接。
因此,您需要使用它: