Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫线图导数的变化_Python_Pandas_Matplotlib_Plot - Fatal编程技术网

Python 熊猫线图导数的变化

Python 熊猫线图导数的变化,python,pandas,matplotlib,plot,Python,Pandas,Matplotlib,Plot,我试图使用我的数据在matplotlib中复制此图,即带有垂直线的线形图,描绘正、负或平导数变化发生的变化 我已经创建了一个数据帧,以diff作为导数,每次导数中出现任意中断时,我都要在y轴上绘制lat,在x轴上绘制时间,在段编号中出现中断的地方绘制一条v线 lat time trip_id diff shifted Segment -7.11559 2015-12-16 21:53:47 17601 0.00446 0.00

我试图使用我的数据在matplotlib中复制此图,即带有垂直线的线形图,描绘正、负或平导数变化发生的变化

我已经创建了一个数据帧,以diff作为导数,每次导数中出现任意中断时,我都要在y轴上绘制lat,在x轴上绘制时间,在段编号中出现中断的地方绘制一条v线

     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()
但是,如上所述运行代码时,我在
plt.axvline
上得到
KeyError:0
。如果我手动将日期插入行
plt.axvline(x='2015-12-24 21:51:45')
中,我会得到
ValueError:float()的无效文本:2015-12-24 21:51:45


关于如何a)解决此问题或b)在x轴上打印带有时间序列的V线,您有什么想法吗?

也许这将有助于:

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)

有关更多详细示例,请参见。

以下是我如何解决此问题的。它可以工作,但只需要一些调整,以平滑线中所有微小的衍生变化。欢迎任何补充或改进

previous = None
segnumber = 0

def func(row):
   global segnumber
    previous = row['shifted']
    if row['diff'] > 0:
        if previous < -0.5 or previous == 0:
            segnumber = segnumber + 1
        return segnumber
    elif row['diff'] == 0:
        if previous < -0.5 or previous > 0.5:
            segnumber = segnumber + 1
        return segnumber
    elif row['diff'] < 0:
        if previous > 0.5 or previous == 0:
            segnumber = segnumber + 1
        return segnumber

df['Segment'] = df.apply(func, axis=1)
df['dup'] = df.duplicated('Segment')

plotList = df.loc[df['dup'] == False, 'time'].tolist()

ax = df.plot(x='time',y='lat')
for i in plotList:
    plt.axvline(x=i)
plt.show()
previous=None
segnumber=0
def func(世界其他地区):
全局序列号
上一行=行[“移位”]
如果行['diff']>0:
如果先前<-0.5或先前==0:
segnumber=segnumber+1
返回序列号
elif行['diff']==0:
如果先前<-0.5或先前>0.5:
segnumber=segnumber+1
返回序列号
elif行['diff']<0:
如果先前>0.5或先前==0:
segnumber=segnumber+1
返回序列号
df['Segment']=df.apply(函数,轴=1)
df['dup']=df.duplicated('段')
plotList=df.loc[df['dup']==False,'time'].tolist()
ax=df.plot(x='time',y='lat')
对于plotList中的i:
零件轴(x=i)
plt.show()