我有一个看起来有点像这样的pyplot图表:
如何让红线和蓝线停在最后一个数据点(分别是5月13日和5月19日),而不是向最右边的水平线延续?
每一行由每个连续时间x
的{{1}}值增加的点组成。数据有时是从快照中获取的,因此它们会在不同的时间停止。
我已经尝试过最好的google-fu,但没有真正找到任何有用的东西,没有手动绘制线的所有部分。
以下是生成图表的代码,如果有帮助的话:
t
答案 0 :(得分:1)
很难知道在没有数据的情况下到底发生了什么,但一般来说,如果您正在绘制Series
个datetime
个对象作为索引,那么您应该尝试做什么。
考虑:
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)
输出:
因此,对于您的用例,请考虑执行类似
的操作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)