Python 熊猫线图导数的变化
我试图使用我的数据在matplotlib中复制此图,即带有垂直线的线形图,描绘正、负或平导数变化发生的变化 我已经创建了一个数据帧,以diff作为导数,每次导数中出现任意中断时,我都要在y轴上绘制lat,在x轴上绘制时间,在段编号中出现中断的地方绘制一条v线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
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()