【问题标题】:Plotting and removing a vertical line inside a loop matplotlib/seaborn在循环 matplotlib/seaborn 内绘制和删除垂直线
【发布时间】:2020-08-10 01:45:37
【问题描述】:

我有一个 pandas DataFrame stock_open,其中包含股票价格与日期,看起来像:

我想绘制股票价格与日期列的时间序列线图,并通过为每个日期绘制一条垂直线来显示日期增加。我想通过绘制几个日期的图表来实现这一点,将这些图表保存为单独的图像,然后使用 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

除了垂直线在所有迭代中“持续”在图中之外,一切正常。

第一张图片符合预期:

但是循环中以下迭代的图像具有上一次迭代的垂直线:

(图像被故意裁剪)

我想从以前的迭代中删除垂直线。

我想过使用matplotlib中的动画,但是在这个过程中其他的子图也需要更新和保存。

有没有办法不从头开始呢? 最初我想显示一个带有日期的移动线图,但也无法实现。所以我用这个策略来显示图上的更新。

TIA!

【问题讨论】:

  • 捕获ax.axvline的输出,然后使用set_xdata(?)方法移动它
  • @PaulH 感谢您的回答!这可能是非常基本的,但您能解释一下如何在循环中捕获ax3.axvline() 的输出吗?有这样做的功能吗?你能给我指出一些例子吗?谢谢!

标签: python-3.x pandas for-loop matplotlib seaborn


【解决方案1】:

已回答!

Original answer from @YesLod on 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

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多