来自单个pandas数据帧的多个图

时间:2017-06-23 07:54:15

标签: python pandas matplotlib

以下是数据框中的字段

date        dept      residual
4/22/17      8         100.00
4/29/17      8         23.34
 ....        8         ...
 ....        8         ...

4/22/17     12         10.10
....        12         ...
....        12         ...

我想绘制每个部门的残差,日期是x轴,我想要单独的图。我可以绘制每个部门的线图,但使用以下代码作为单个图:

data = pd.DataFrame.from_csv('hardlines_error.csv')

for label, df in data.groupby('dept'):
    df.residual.plot(  label=label,)
plt.legend()

有人可以告诉我如何将它们绘制成网格中的单独图形吗?

2 个答案:

答案 0 :(得分:2)

如果需要一张图表,我认为您需要pivot然后plot

df = df.pivot(index='date',columns='dept', values='residual')
print (df)
dept         8     12
date                 
4/22/17  100.00  10.1
4/29/17   23.34   NaN

替代解决方案:

df = df.set_index(['date','dept'])['residual'].unstack()
print (df)
dept         8     12
date                 
4/22/17  100.00  10.1
4/29/17   23.34   NaN


df.plot()

但如果有重复,请收到错误:

  

ValueError:索引包含重复的条目,无法重塑

然后需要使用汇总功能的pivot_tablegroupby - 请检查this answer

但如果需要单独使用每个图形:

for i, group in df.groupby('dept'):
    plt.figure()
    group.plot(x='date', y='residual', title=str(i))

对于网格使用:

import matplotlib.pyplot as plt

grouped = df.groupby('dept')

ncols=2
nrows = int(np.ceil(grouped.ngroups/ncols))

fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(12,4), sharey=True)
for (key, ax) in zip(grouped.groups.keys(), axes.flatten()):
    grouped.get_group(key).plot(x='date', y='residual', ax=ax)

ax.legend()
plt.show()

答案 1 :(得分:1)

你可以使用Seaborn facetgrid。

https://www.centos.org/forums/viewtopic.php?t=17634