Как нанести вертикальные линии на уже нанесенный линейный график? - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь построить вертикальные линии в линейке, которую я уже нанес.

Небольшая часть моих данных выглядит следующим образом:

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 ]

1 голос
/ 18 апреля 2019

Простой подход:

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
0 голосов
/ 18 апреля 2019

Полагаю, проблема также в нахождении минимумов, по вертикальной линии уже дан ответ здесь

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) 
0 голосов
/ 18 апреля 2019

Подсчитайте ваши минуты, скажем, в виде списка.Затем, перед plt.show вставьте цикл for для всех ваших минут и шагов (для каждой минуты должен быть один шаг):

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] для удобства чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...