【发布时间】: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