熊猫:将多个时间序列DataFrame绘制成单个图

时间:2016-07-05 07:49:16

标签: python pandas matplotlib pandas-groupby

我有以下pandas DataFrame:

     time      Group      blocks
0     1        A           4
1     2        A           7
2     3        A           12
3     4        A           17
4     5        A           21 
5     6        A           26
6     7        A           33
7     8        A           39
8     9        A           48
9     10       A           59
    ....        ....          ....
36     35      A           231
37     1       B           1
38     2       B           1.5
39     3       B           3
40     4       B           5
41     5       B           6
    ....        ....          ....
911    35      Z           349

这是一个包含多个时间序列问号数据的数据框,从min=1max=35。每个Group都有这样的时间序列。

我想将每个单独的时间序列A到Z绘制为1到35的x轴。每次y轴都是blocks

我正在考虑使用像Andrews Curves plot这样的东西,它会将每个系列相互映射。每个"色调"将被设置为不同的组。 (欢迎其他想法。)

enter image description here

我的问题:如何格式化此数据框以绘制多个系列?列应该是GroupAGroupB等吗?

如何使数据框格式为:

time GroupA blocksA GroupsB blocksB GroupsC blocksC....

这是安德鲁斯情节的正确格式,如图所示?

修改

如果我尝试:

df.groupby('Group').plot(legend=False)

x轴完全不正确。所有时间序列应绘制在0到35之间,所有时间序列都在一个系列中。

enter image description here

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

看看这些变种​​。首先是安德鲁斯'曲线,第二个是多线图,按一列Month分组。数据框data包含三列TemperatureDayMonth

import pandas as pd
import statsmodels.api as sm
import matplotlib.pylab as plt
from pandas.tools.plotting import andrews_curves

data = sm.datasets.get_rdataset('airquality').data
fig, (ax1, ax2) = plt.subplots(nrows = 2, ncols = 1)
data = data[data.columns.tolist()[3:]] # use only Temp, Month, Day

# Andrews' curves
andrews_curves(data, 'Month', ax=ax1)

# multiline plot with group by
for key, grp in data.groupby(['Month']): 
    ax2.plot(grp['Day'], grp['Temp'], label = "Temp in {0:02d}".format(key))
plt.legend(loc='best')    
plt.show()

当你策划安德鲁斯'将您的数据曲线修复为一个函数。这意味着安德鲁斯'由靠近在一起的函数表示的曲线表明相应的数据点也将靠近在一起。

enter image description here

答案 1 :(得分:2)

您可以将数据重新构造为数据透视表:

df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()