如何在已经绘制的线图中绘制垂直线?

时间:2019-04-18 09:53:50

标签: python python-3.x matplotlib seaborn

我正在尝试在已经绘制的线段中绘制垂直线。

我的一小部分数据如下所示:

EscAct_Curr_A   StepID  Time_Elapsed
0.122100122272968   1   0.0
0.0                 2   0.101
0.0                 2   0.432
0.122100122272968   2   1.422
0.122100122272968   2   2.422
0.122100122272968   2   3.422
0.122100122272968   2   4.432
0.122100122272968   2   5.938
0.122100122272968   2   6.49
0.122100122272968   5   7.928
0.122100122272968   5   8.938
0.122100122272968   5   9.938

在图形上绘制整个数据时,我使用以下代码:

x = data['Time_Elapsed']
y = data['EscAct_Curr_A']
plt.plot(x, y)
plt.show()

我得到下图:

enter image description here

我现在要做的是找到每个StepID的最短时间,并在上面的图中绘制一条垂直线。

例如:

从以上数据中,我们可以看到0.0是StepID 1的最短时间,因此必须在0.0处绘制一条垂直线,并且必须将其命名为1,然后对于StepID 2,0.101是最短时间,因此必须在0.101处绘制一条垂直线,并将其命名为2,依此类推。

我想知道如何在matplotlib或seaborn中完成

谢谢

3 个答案:

答案 0 :(得分:1)

一种简单的方法:

m=0
tm=data['Time_Elapsed']
for i,val in enumerate(data['StepID']):
    if(val!=m):#detect change in val
       m=val
       plt.plot([tm[i],tm[i]],[0,1])#plot a vertical line

答案 1 :(得分:0)

计算您的分钟数,以列表形式表示。然后,在plt.show进入for循环以获取所有的分钟时间和stepid(每个分钟时间应该有一个stepid)之前:

for i in range(len(mintimes)):
    plt.axvline(x=mintime[i], color='b')
    plt.figtext( mintime[i], y_convenient, str(stepid[i]), color='tab:brown', size='x-small', fontweight='bold' )

所以y_convenient会有些高,您希望将其显示在台阶上。我已经指出了一些格式化的可能性。您可能需要进行调整,例如可能为了提高可读性而在mintime [i]中添加偏移量。

答案 2 :(得分:0)

我猜问题也在寻找最小值,垂直线已经回答here

import numpy as np

# build an array with the stepIDs
stepIDs = np.unique(data['stepID'])
minTimes = np.zeros_like(stepIDs)

# then loop through it
for j in range(len(stepIDs)):
  currentID = stepIDs[j]
  currentTimes = data['Time_Elapsed'][np.where(data['stepID'] == currentID)]
  minTimes[j] = min(currentTimes)

# then just plot the lines as explained in 
# https://stackoverflow.com/questions/24988448/how-to-draw-vertical-lines-on-a-given-plot-in-matplotlib
for minTime in minTimes:
    plt.axvline(x=minTimes)