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

Python在同一绘图上绘制多个时间序列,python,matplotlib,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 我已将该文件解析为一个列表字典,其中包含序列标签上键入的(时间、值)元组。我一直在苦苦思索如何用这些数据从这张图变成单

我正在解析一个文件,该文件具有多个时间序列的时间戳数据,我想用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
我已将该文件解析为一个列表字典,其中包含序列标签上键入的(时间、值)元组。我一直在苦苦思索如何用这些数据从这张图变成单线图。我希望在一个单独的绘图上为seriesA、serieb、seriesC等绘制独立的线条。有什么建议吗

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

{'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)]}

我喜欢熊猫解决这类问题

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

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})
>>> 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
导致此数据帧:

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})
>>> 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
然后,您可以执行以下操作:

by_label = df.groupby('label')

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

plt.legend()
plt.show
关于如何在字典中存储数据;有不同的方法可以做到这一点,但如果我是你,并且能够通过
pandas
轻松使用你的数据,我会使用以下形式的词典:

data = {'label':['client1', 'client1', 'client2', ...], 
 'time':[time1, time2, time3, ...], 
 'value':[value1, value2, value3, ...]}

确保所有列表的顺序正确(所有3个键的索引0是数据帧的第0行,索引1是第1行,等等)。然后要导入pandas,您需要做的就是
df=pd.DataFrame(data)
简短回答:

突出显示并按ctrl+c组合键控制以下数据:

label        time         value
client1  861.991699  2.981890e+08
client1  862.000768  0.000000e+00
client2  861.781502  0.000000e+00
client2  861.789037  1.536000e+08
client2  862.281483  0.000000e+00
client2  862.289038  1.536000e+08
client3  862.004471  3.295674e+09
client3  862.004564  3.295674e+09
client3  862.039818  7.990149e+08
client3  862.040403  1.599078e+09
client3  862.540270  3.295674e+09
client3  862.551331  1.599078e+09
然后运行以下代码段:

# imports
import pandas as pd

# read data from the clipboard
df = pd.read_clipboard(sep='\\s+')

# reshape the data to get values by time for each label
df = df.pivot(index='time', columns='label', values='value')

# Replace nans by forward filling existing values
df = df.fillna(method = 'ffill')

# You'll still have to handle the missing values in the beginning of the coloumns
df = df.fillna(method = 'bfill')

# A simple plot:
df.plot()
然后你会得到:


详细信息

在这个问题上有一些令人困惑的因素。如果您的数据如您所说是以下形式:

time label   value
1.05 seriesA 3.925
1.09 seriesC 0.245
2.13 seriesB 12.32
2.73 seriesC 4.921
但数据的真正内容是:

{'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)]}
那么数据的真正内容和形式应该是:

label        time         value
client1  861.991699  2.981890e+08
client1  862.000768  0.000000e+00
client2  861.781502  0.000000e+00
client2  861.789037  1.536000e+08
client2  862.281483  0.000000e+00
client2  862.289038  1.536000e+08
client3  862.004471  3.295674e+09
client3  862.004564  3.295674e+09
client3  862.039818  7.990149e+08
client3  862.040403  1.599078e+09
client3  862.540270  3.295674e+09
client3  862.551331  1.599078e+09
在任何情况下,绝对没有理由利用字典来获取你的信息

[…]所有这些数据的单线图。我希望在一个单独的绘图上为seriesA、serieb、seriesC等绘制独立的线条

我相信最有效的方法是从政府部门开始。从那里,您可以使用
df.plot()
直接打印数据

突出显示并按住ctrl+c组合键,即可开始:

# imports
import pandas as pd

# read data from the clipboard
df = pd.read_clipboard(sep='\\s+')

# reshape the data to get values by time for each label
df = df.pivot(index='time', columns='label', values='value')
print(df)
这应表示所需的数据形式:

label           client1      client2       client3
time                                              
861.781502          NaN          0.0           NaN
861.789037          NaN  153600000.0           NaN
861.991699  298189000.0          NaN           NaN
862.000768          0.0          NaN           NaN
862.004471          NaN          NaN  3.295674e+09
862.004564          NaN          NaN  3.295674e+09
862.039818          NaN          NaN  7.990149e+08
862.040403          NaN          NaN  1.599078e+09
862.281483          NaN          0.0           NaN
862.289038          NaN  153600000.0           NaN
862.540270          NaN          NaN  3.295674e+09
862.551331          NaN          NaN  1.599078e+09
鉴于时间指数有些特殊,仍有一些问题需要处理。为了使这个数据图友好,我们应该处理缺失的值。在下一个代码段中,可以使用以下文件中的
df.fillna
轻松完成此操作:

现在,只需使用
df.plot()
,就可以得到一个折线图:

编辑:


让我知道您的数据源是什么,以便为您提供有关如何读取和存储数据的一些提示。同样,熊猫和熊猫是最有可能的方式。

这种表格数据确实是的用例。查看
DataFrame.groupy
。如果您想在Python中使用它,可以使用<代码> ItdioTo.GlpBy < /Cl>按标签分组,然后用MatpTllb绘图。“从MatpTllIB导入PyPlice作为该代码所需的PLT”,请考虑EddiTeX是整洁的,但由于某种原因,我得到了这个问题:ValueError:用序列设置数组元素。