Python 线在同一图上绘制多个时间序列

Mik*_*ney 3 python matplotlib

我正在解析一个文件,该文件具有多个时间序列的时间序列时间戳数据,我想在 python 中解析这些数据,然后使用 matplotlib 为每组时间序列数据创建一个带有独立线的单线图。我正在解析的数据如下所示:

time label   value
1.05 seriesA 3.925
1.09 seriesC 0.245
2.13 seriesB 12.32
2.73 seriesC 4.921
Run Code Online (Sandbox Code Playgroud)

我已将该文件解析为包含在系列标签上键入的 (time,value) 元组的列表字典。我正在努力解决如何从所有这些数据获得单线图。我希望在单个绘图上为系列 A、系列 B、系列 C 等提供独立的线条。任何指针?

编辑:根据要求,字典如下。我很难找出存储这些数据的最佳方式,所以也许我使用的数据结构也是一个问题。下面的键是不同的时间序列标签,值是 (time,value) 元组的列表。无论如何,这里是:

{'client1': [(861.991698574, 298189000.0), (862.000768158, 0.0)], 
'client2': [(861.781502324, 0.0), (861.78903722, 153600000.0), 
(862.281483262, 0.0), (862.289038158, 153600000.0)], 'client3': 
[(862.004470762, 3295674368.0), (862.004563939, 3295674368.0), 
(862.03981821, 799014912.0), (862.040403314, 1599078400.0), 
(862.540269616, 3295674368.0), (862.55133097, 1599078400.0)]}
Run Code Online (Sandbox Code Playgroud)

sac*_*cuL 5

我喜欢用熊猫解决这类问题。

首先,将数据放入数据pandas框中:

import pandas as pd

data = {'client1': [(861.991698574, 298189000.0), (862.000768158, 0.0)], 
'client2': [(861.781502324, 0.0), (861.78903722, 153600000.0), 
(862.281483262, 0.0), (862.289038158, 153600000.0)], 'client3': 
[(862.004470762, 3295674368.0), (862.004563939, 3295674368.0), 
(862.03981821, 799014912.0), (862.040403314, 1599078400.0), 
(862.540269616, 3295674368.0), (862.55133097, 1599078400.0)]}

time = []
label = []
value = []

for k, v in data.items():
    for tup in v:
        label.append(k)
        time.append(tup[0])
        value.append(tup[1])

df = pd.DataFrame({'time':time, 'label':label, 'value':value})
Run Code Online (Sandbox Code Playgroud)

导致此数据帧:

>>> df
      label        time         value
0   client1  861.991699  2.981890e+08
1   client1  862.000768  0.000000e+00
2   client2  861.781502  0.000000e+00
3   client2  861.789037  1.536000e+08
4   client2  862.281483  0.000000e+00
5   client2  862.289038  1.536000e+08
6   client3  862.004471  3.295674e+09
7   client3  862.004564  3.295674e+09
8   client3  862.039818  7.990149e+08
9   client3  862.040403  1.599078e+09
10  client3  862.540270  3.295674e+09
11  client3  862.551331  1.599078e+09
Run Code Online (Sandbox Code Playgroud)

然后,你可以这样做:

by_label = df.groupby('label')

for name, group in by_label:
    plt.plot(group['time'], group['value'], label=name)

plt.legend()
plt.show
Run Code Online (Sandbox Code Playgroud)

关于如何将数据存储在字典中;有不同的方法来解决这个问题,但如果我是你,并且能够轻松地使用你的数据pandas,我会使用以下形式的字典:

data = {'label':['client1', 'client1', 'client2', ...], 
 'time':[time1, time2, time3, ...], 
 'value':[value1, value2, value3, ...]}
Run Code Online (Sandbox Code Playgroud)

确保所有列表都以正确的方式排序(所有 3 个键的索引 0 是数据帧的第 0 行,索引 1 是第 1 行,等等)。然后导入熊猫,你需要做的就是df = pd.DataFrame(data)