Построение и удаление вертикальной линии внутри al oop matplotlib / seaborn - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть pandas DataFrame stock_open, который содержит цены акций против дат и выглядит так: Stock prices vs dates

Я хочу построить график временных рядов акций цены по сравнению со столбцом даты и показывают возрастающие даты путем построения вертикальной линии для каждой даты. Я хочу добиться этого путем построения графиков на несколько дат, сохранения этих графиков в виде отдельных изображений и последующего использования ffmpeg, чтобы объединить их в видео. Итак, я сделал это:

import matplotlib.pyplot as plt
import seaborn as sns

my_dates = ['2019-11-20', '2019-12-20', '2020-01-20', '2020-02-20', '2020-03-20']

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2, figsize=(20, 8))

sns.lineplot(x='Date', y='value', hue='variable',
             data=pd.melt(stock_open, ['Date']), ax=ax3)
ax3.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plot_no = 0
for i in range(len(my_dates)):
    my_selected_date = my_dates[i]
    ax3.axvline(my_selected_date)
    ax3.set_title(str(my_selected_date))
    fig.savefig('output_images/stock_image_{plot_no:04d}.png'.format(plot_no=plot_no))
    plot_no += 1

Все работает нормально, за исключением того, что вертикальная линия «сохраняется» на фигурах во всех итерациях.

Первое изображение, как и ожидалось: stock_plot_0000

Но изображения из следующих итераций в l oop имеют вертикальную линию из предыдущей итерации: stock_plot_0004

(изображения обрезаны намеренно)

Я хочу удалить вертикальную линию из предыдущих итераций.

Я подумал об использовании анимации из matplotlib, но другие подфигуры также должны быть обновлены и сохранены в этом процессе.

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

TIA!

1 Ответ

0 голосов
/ 26 апреля 2020

ОТВЕТИЛ!

Оригинальный ответ от @YesLod на Reddit

for i in range(len(my_dates)):
    my_selected_date = my_dates[i]
    line=ax3.axvline(my_selected_date)   # changed
    ax3.set_title(str(my_selected_date))
    fig.savefig('output_images/stock_image_{plot_no:04d}.png'.format(plot_no=plot_no))
    plot_no += 1

    plt.pause(0.1)  # added
    line.remove()   # added

Спасибо!

...