Как рекурсивно добавить строку кода для построения текста с заданным условием

#python #class #matplotlib

#python #класс #matplotlib

Вопрос:

Итак, на этом графике ниже я нахожу отдельные точки и их индексы. Когда мы рисуем окончательный рисунок, на рисунке должна быть информация о том, когда именно произошел разрыв, и должна быть добавлена вертикальная линия на разрыве. Чтобы сделать это, мне пришлось добавить «plt.axvline» и «plt.text» вместе как пару.

График с точками останова

Я выписал код, подобный этому здесь:

Однако всякий раз, когда появляется новый индекс, очень неудобно добавлять две строки кода вручную, и что, если проявится 100 разрывов, их почти невозможно добавить.

Я думаю об объектно-ориентированном методе для этого, например, «класс», но я понятия не имею, с чего начать..

Есть идеи о том, как рекурсивно добавить его, зная длину индексов?

 if len(idx) == 1 :     
    plt.figure(figsize = (20,10))
    plt.axvline(x=idx[0], color = 'r')
    plt.text(idx[0],.13, '{}'.format(send_time[idx[0]-1]))
    plt.title(var)
    plt.scatter(x, result, alpha = alp)
    plt.savefig("XXX.png")
    plt.close()
elif len(idx) == 2:
    plt.figure(figsize = (20,10))
    plt.axvline(x=idx[0], color = 'r')
    plt.text(idx[0],.10, '{}n{}'.format(send_time[idx[0]], time1[idx[0]]))
    plt.axvline(x=idx[1], color = 'b')
    plt.text(idx[1],.10, '{}'.format(send_time[idx[1]-1]))
    plt.title(var)
    plt.scatter(x, result, alpha = alp)
    plt.savefig("XXX.png")
    plt.close()
elif len(idx) == 3:
    plt.figure(figsize = (20,10))
    plt.axvline(x=idx[0], color = 'r')
    plt.text(idx[0],.13, '{}n{}'.format(send_time[idx[0]],time1[idx[0]]))
    plt.axvline(x=idx[1], color = 'b')
    plt.text(idx[1],.12, '{}n{}'.format(send_time[idx[1]],time1[idx[1]]))
    plt.axvline(x=idx[2], color = 'y')
    plt.text(idx[2],.11, '{}'.format(send_time[idx[2]-1]))
    plt.title(var)
    plt.scatter(x, result, alpha = alp)
    plt.savefig("XXX.png")
    plt.close()
  

Комментарии:

1. важен ли разный цвет для каждой строки axvline? В противном случае простой цикл for через idx мог бы выполнить эту работу

2. @jrmylow Не могли бы вы привести мне короткий пример выполнения этого с помощью цикла for ? Я думаю, что я мог бы использовать для этого тот же цвет.

3. в чем значение send_time и time1 ?

Ответ №1:

В общем, лучше перебирать коллекцию напрямую for item in collection , а не использовать индексы.

 plt.figure(figsize = (20,10))
for num in idx:
    plt.axvline(num, color = 'r')
    plt.text(num, .13, '{}'.format(send_time[num-1]))
plt.title(var)
plt.scatter(x, result, alpha = alp)
plt.savefig("XXX.png")
plt.close()