如何在Python中将不同的时间序列图合并到2D中

如何在Python中将不同的时间序列图合并到2D中,python,python-3.x,numpy,matplotlib,time-series,Python,Python 3.x,Numpy,Matplotlib,Time Series,我有以下格式的三个不同的时间序列数据,其中第一列是timestamp,第二列是值 0.086206438,10 0.086425551,12 0.089227066,20 0.089262508,24 0.089744425,30 0.090036815,40 0.090054172,28 0.090377569,28 0.090514071,28 0.090762872,28 0.090912691,27 为了重现性,我共享了我正在使用的三个时间序列数据 从第2列中,我想读取当前行并将其与前

我有以下格式的三个不同的时间序列数据,其中第一列是timestamp,第二列是值

0.086206438,10
0.086425551,12
0.089227066,20
0.089262508,24
0.089744425,30
0.090036815,40
0.090054172,28
0.090377569,28
0.090514071,28
0.090762872,28
0.090912691,27
为了重现性,我共享了我正在使用的三个时间序列数据

从第2列中,我想读取当前行并将其与前一行的值进行比较。如果它更大,我会继续比较。如果当前值小于上一行的值continue,则取差值。让我说清楚。例如,在我提供的上述示例记录中,第七行(28)小于第六行(40)中的值-因此它将是(40-28=12)

这是我的示例代码

import numpy as np
import pandas as pd
import csv
import numpy as np
import scipy.stats
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm
from statsmodels.graphics.tsaplots import plot_acf, acf


protocols = {}


types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}

for protname, fname in types.items():
    arr = []  
    arr1 = []  
    with open(fname, mode='r', encoding='utf-8-sig') as f:
        reader = csv.reader(f, delimiter=",")
        for i in reader:
            arr.append(int(i[1])) 
            arr1.append(float(i[0])) 

    arr, arr1 = np.array(arr), np.array(arr1)
    diffs = np.diff(arr)
    diffs1 = np.diff(arr1)
    diffs1 = diffs1[diffs > 0] 
    diffs = diffs[diffs > 0] # To keep only the increased values
    protocols[protname] = {
        "rtime": np.array(arr1),
        "rdata": np.array(arr),
        "data": diffs,
        "timediff": diffs,
    }

## change in time 
for protname, values in protocols.items():
    d = values["rdata"]
    t = values["rtime"]
    d = np.diff(d, 1) #/ d[:-1]
    t = np.diff(t, 1)
    plt.plot(t, d, ".", label=protname, alpha=0.5)
    plt.xlabel("Changes in time")
    plt.ylabel("differences")
    plt.legend()
    plt.show()
这给了我以下的情节


我们如何在我分别包含的三个数据的二维(2D)图中绘制差异与时间变化(onw列)

将所有三个绘图合并为一个:取消显示
plt.show()

仅打印数组的负值:

plt.plot(t[d<0], d[d<0], ...) 

plt.plot(t[d如果你改变循环

for protname, values in protocols.items():
    d = values["rdata"]
    t = values["rtime"]
    d = np.diff(d, 1) #/ d[:-1]
    t = np.diff(t, 1)
    plt.plot(t, d, ".", label=protname, alpha=0.5)
    plt.xlabel("Changes in time")
    plt.ylabel("differences")
    plt.legend()
    plt.show()

对于protname,protocols.items()中的值:
d=值[“rdata”]
t=值[“rtime”]
d=np.diff(d,1)#/d[:-1]
t=np.diff(t,1)
plt.plot(t[d<0],d[d<0],“,”,label=protname,alpha=0.5)
plt.xlabel(“时间变化”)
plt.ylabel(“差异”)
plt.legend()
plt.show()
你会得到一个像


如果我理解正确,我相信这就是你想要的。

你能澄清你到底想要什么吗?你想要三张图合一吗?是的,其中三张图合一,但在2D中忽略Y轴上的正值(差异).那么,您希望这三个数据集作为不同的系列出现在同一个绘图上?或者您想要一个完全不同的图形?您是否试图简单地取消记录
plt.show()
?这样您就不会显示循环中的每个绘图,而是在循环完成时将所有三个绘图一起显示?@SpghttCd,是的,我显示了,但我不希望Y轴中的正值被包括在内。正是如此,我已经让您的答案被接受。非常感谢。我正在寻找对这些模式进行分类的方法。正如您所看到的,它似乎是要知道哪一点属于哪一个数据并不容易。你有没有看到像这样对时间序列数据进行分类的好方法?当你绘制我共享的原始数据时,你可以很容易地看到模式。谢谢你。如果我们能取每个数据的平均差异值呢?不客气-我不太明白。差异是
d NP.Mean(D)< /代码>。你想知道如何绘制吗?你可以添加一条水平线(<代码> PLT.HLLIN(NP.Mean(D),NP.MIN(T),NP.MAX(T))< /代码>)或者如果你对数据的统计视图更感兴趣,也许考虑使用例如。但是我想<代码> NP.Mean(D)
将每个数据分开。如果我们做
plt.hlines(np.mean(d)、np.min(t)、np.max(t))
-它将我共享的三个数据的平均值合并在一个数据中,这使得比较(分类)变得困难三个数据。不,为什么?你在一个循环中计算
d
,因此
d
不是所有的数据,而是一个子集。在
t
上绘制
d
也会导致三个图,而不仅仅是一个图。所以它的平均值就是一个子集的平均值。你是否已经尝试添加
plt.hlines()
循环中的函数?是的,我这样做了,它只绘制了一条直线。我想单独查看它们的原因是为了对我与我的问题共享的数据进行分类,以防您没有看到。
for protname, values in protocols.items():
    d = values["rdata"]
    t = values["rtime"]
    d = np.diff(d, 1) #/ d[:-1]
    t = np.diff(t, 1)
    plt.plot(t[d < 0], d[d < 0], ".", label=protname, alpha=0.5)
    plt.xlabel("Changes in time")
    plt.ylabel("differences")
    plt.legend()

plt.show()