16

我有以下熊猫数据框:

     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的东西,它将每个系列相互绘制。每个“色调”将被设置为不同的组。(欢迎其他想法。)

在此处输入图像描述

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

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

time GroupA blocksA GroupsB blocksB GroupsC blocksC....

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

编辑

如果我尝试:

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

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

在此处输入图像描述

我该如何解决这个问题?

4

2 回答 2

12

看看这个变种。第一个是安德鲁斯曲线,第二个是按一列分组的多线图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()

当您绘制安德鲁斯曲线时,您的数据被保存到一个函数中。这意味着由函数表示的安德鲁斯曲线靠近在一起表明相应的数据点也将靠近在一起。

在此处输入图像描述

于 2016-07-05T08:33:03.493 回答
12

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

df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()
于 2018-11-14T19:42:28.473 回答