Pandas: 将多个时间序列 DataFrame 绘制成一个图
Pandas: plot multiple time series DataFrame into a single plot
我有以下 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=1
到 max=35
。每个 Group
都有一个这样的时间序列。
我想根据 1 到 35 的 x 轴绘制每个单独的时间序列 A 到 Z。y 轴每次都是 blocks
。
我正在考虑使用 Andrews Curves plot 之类的东西,它可以将每个系列相互绘制。每个 "hue" 将被设置为不同的组。 (欢迎提出其他想法。)
我的问题:如何格式化此数据框以绘制多个系列?列应该是 GroupA
、GroupB
等吗?
如何让数据框采用以下格式:
time GroupA blocksA GroupsB blocksB GroupsC blocksC....
如图所示,这是 Andrews 图的正确格式吗?
编辑
如果我尝试:
df.groupby('Group').plot(legend=False)
x 轴完全不正确。所有时间序列都应该从 0 到 35 绘制,全部在一个系列中。
我该如何解决这个问题?
看看这个变体。第一个是安德鲁斯曲线,第二个是按一列 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()
当你绘制安德鲁斯曲线时,你的数据被回收到一个函数中。这意味着由靠近在一起的函数表示的安德鲁斯曲线表明相应的数据点也将靠近在一起。
您可以将数据重新构造为枢轴 table:
df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()
我有以下 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=1
到 max=35
。每个 Group
都有一个这样的时间序列。
我想根据 1 到 35 的 x 轴绘制每个单独的时间序列 A 到 Z。y 轴每次都是 blocks
。
我正在考虑使用 Andrews Curves plot 之类的东西,它可以将每个系列相互绘制。每个 "hue" 将被设置为不同的组。 (欢迎提出其他想法。)
我的问题:如何格式化此数据框以绘制多个系列?列应该是 GroupA
、GroupB
等吗?
如何让数据框采用以下格式:
time GroupA blocksA GroupsB blocksB GroupsC blocksC....
如图所示,这是 Andrews 图的正确格式吗?
编辑
如果我尝试:
df.groupby('Group').plot(legend=False)
x 轴完全不正确。所有时间序列都应该从 0 到 35 绘制,全部在一个系列中。
我该如何解决这个问题?
看看这个变体。第一个是安德鲁斯曲线,第二个是按一列 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()
当你绘制安德鲁斯曲线时,你的数据被回收到一个函数中。这意味着由靠近在一起的函数表示的安德鲁斯曲线表明相应的数据点也将靠近在一起。
您可以将数据重新构造为枢轴 table:
df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()