我正在尝试使用我的数据在matplotlib中复制此图,即带有垂直线的折线图,该线描述发生正,负或平坦导数变化的变化。

python -  Pandas 中线图的导数变化-LMLPHP

我创建了一个以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

09-04 12:28