pyplot时间序列中最后一个数据点的结束图

时间:2016-05-26 09:52:20

标签: python matplotlib

我有一个看起来有点像这样的pyplot图表:

The chart in question

如何让红线和蓝线停在最后一个数据点(分别是5月13日和5月19日),而不是向最右边的水平线延续?

每一行由每个连续时间x的{​​{1}}值增加的点组成。数据有时是从快照中获取的,因此它们会在不同的时间停止。

我已经尝试过最好的google-fu,但没有真正找到任何有用的东西,没有手动绘制线的所有部分。

以下是生成图表的代码,如果有帮助的话:

t

2 个答案:

答案 0 :(得分:1)

很难知道在没有数据的情况下到底发生了什么,但一般来说,如果您正在绘制Seriesdatetime个对象作为索引,那么您应该尝试做什么。

考虑:

import pandas as pd
import matplotlib.pyplot as plt

a = pd.Series(np.random.rand(10), index=pd.date_range("2016-01-01","2016-10-01",freq="MS"))
b = pd.Series(np.random.rand(5), index=pd.date_range("2016-01-01","2016-5-01",freq="MS"))

fig, ax = plt.subplots()
ax.plot(a)
ax.plot(b)

输出:

enter image description here

因此,对于您的用例,请考虑执行类似

的操作
axes.plot(pd.Series(y, index=x), colours.next(), label=file)

答案 1 :(得分:1)

假设y

In [27]: y = np.concatenate([[0,1,4,4,2,3], [4]*3]); y
Out[27]: array([0, 1, 4, 4, 2, 3, 4, 4, 4])

我们要删除y尾部重复的4个,以便它变为

array([0, 1, 4, 4, 2, 3, 4])

为此,我们可以找到y中哪些值不等于y中的最后一个值:

In [28]: y != y[-1]
Out[28]: array([ True,  True, False, False,  True,  True, False, False, False], dtype=bool)

找到True值的关联序数索引:

In [29]: np.flatnonzero(y != y[-1])
Out[29]: array([0, 1, 4, 5])

并取最后一个值:

In [30]: np.flatnonzero(y != y[-1])[-1]
Out[30]: 5

因此,要从y的尾端裁剪重复值,我们可以使用

In [31]: y[:np.flatnonzero(y != y[-1])[-1]+2]
Out[31]: array([0, 1, 4, 4, 2, 3, 4])

因此,您可以使用

for file in filenames:
    data = json.loads(open(file + '.json').read())['results']['data']

    # Unzip to a tuple of lists ([x], [y])
    x, y = zip(*[(datetime.utcfromtimestamp(int(d['t']/1000)), d['x']) for d in data])
    y = np.array(y)
    idx = np.flatnonzero(y != y[-1])[-1]+2
    axes.plot(x[:idx], y[:idx], colours.next(), label=file)