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

Sha*_*ang 12 python matplotlib pandas 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
Run Code Online (Sandbox Code Playgroud)

这是多个时间序列,疑问句数据的数据帧,从min=1max=35.每个Group都有这样的时间序列.

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

我正在考虑使用类似安德鲁斯曲线的情节,这将绘制每个系列彼此的对比.每个"色调"将被设置为不同的组.(欢迎其他想法.)

在此输入图像描述

我的问题:你如何格式化这个数据帧来绘制多个系列?如果列是GroupA,GroupB等?

如何使数据帧采用以下格式:

time GroupA blocksA GroupsB blocksB GroupsC blocksC....
Run Code Online (Sandbox Code Playgroud)

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

编辑

如果我尝试:

df.groupby('Group').plot(legend=False)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

我该如何解决这个问题?

Ser*_*ity 9

看看这个变种.第一个是安德鲁斯的曲线,第二个是多线图,按一列分组Month.数据帧data包括三列Temperature,Day以及Month:

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()
Run Code Online (Sandbox Code Playgroud)

当您绘制安德鲁斯的曲线时,您的数据被挽救到一个函数中.这意味着安德鲁斯的曲线由函数紧密联系在一起表明相应的数据点也将紧密相连.

在此输入图像描述


Mic*_*mas 9

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

df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()
Run Code Online (Sandbox Code Playgroud)