我正在尝试使用我的数据在matplotlib中复制此图,即带有垂直线的折线图,该线描述发生正,负或平坦导数变化的变化。
我创建了一个以diff为导数的pandas数据框,并且每当导数出现arbitray中断时就进行段更改,我想在y轴上绘制lat,在x轴上绘制时间,而在vline上绘制一个中断点段号。
lat time trip_id diff shifted Segment
-7.11559 2015-12-16 21:53:47 17601 0.00446 0.00003 0
-7.11559 2015-12-16 21:53:45 17601 0.00000 0.00446 1
-7.11563 2015-12-16 21:53:41 17601 -0.00004 0.00000 2
-7.11551 2015-12-16 21:48:29 17601 0.00012 -0.00004 2
-7.11548 2015-12-16 21:48:27 17601 0.00003 0.00012 2
-7.11545 2015-12-16 21:48:26 17601 0.00003 0.00003 2
-7.11539 2015-12-16 21:48:25 17601 0.00006 0.00003 2
-7.11548 2015-12-16 21:43:17 17601 -0.00009 0.00006 2
-7.11545 2015-12-16 21:43:15 17601 0.00003 -0.00009 2
-7.11545 2015-12-16 21:43:13 17601 0.00000 0.00003 3
-7.11542 2015-12-16 21:43:12 17601 0.00003 0.00000 4
我可以使用
df.plot(x='time',y='lat')
轻松地绘制前2个。但是,我在逻辑上苦苦挣扎,关于如何将vline添加到时间轴以及将哪些参数传递给matplotlib vline的逻辑。任何帮助或提示将不胜感激。更新1。
我已经编写了这段代码,在我看来应该可以解决该问题。
plotList=[]
breaker = pd.unique(df.Segment.ravel())
def pullLine(row):
for i in breaker:
if any(row['Segment']) == i:
plotList.append(row['time'])
# breaker is a list of unique segment numbers, this for loop should loop over breaker and then where the first instance of i == the segment number appending the time value to the list
pullLine(df)
print plotList
fig,ax = plt.subplots()
df.plot(x='Segment',y='lat')
# this loops over `plotList` and should plot a `axvline` at each instance.
for i in plotList:
plt.axvline(x = i,linewidth=2, color='r')
plt.show()
但是,如上所述运行代码,我在
KeyError: 0
上得到了plt.axvline
。如果我手动将日期插入plt.axvline(x = '2015-12-24 21:51:45')
行,则会得到ValueError: invalid literal for float(): 2015-12-24 21:51:45
。关于如何a)解决此问题或b)在x轴上打印具有时间序列的vline的任何想法?
最佳答案
也许这会有所帮助:
y_min, y_max = ax.get_ylim()
ax.add_collections(matplotlib.collections.BrokenBarHCollection.span_where(
x, ymin=y_min, ymax=y_max, where=[your condition],
facecolor='red', alpha=0.25)
有关更多详细示例,请参见matplotlib。