【发布时间】:2020-11-06 23:53:10
【问题描述】:
我正在尝试为 matplotlib 中的 fill_between 形状设置动画,但我不知道如何更新 PolyCollection 的数据。举个简单的例子:我有两条线,我总是在它们之间填充。当然,线条会发生变化并具有动画效果。
这是一个虚拟示例:
import matplotlib.pyplot as plt
# Init plot:
f_dummy = plt.figure(num=None, figsize=(6, 6));
axes_dummy = f_dummy.add_subplot(111);
# Plotting:
line1, = axes_dummy.plot(X, line1_data, color = 'k', linestyle = '--', linewidth=2.0, animated=True);
line2, = axes_dummy.plot(X, line2_data, color = 'Grey', linestyle = '--', linewidth=2.0, animated=True);
fill_lines = axes_dummy.fill_between(X, line1_data, line2_data, color = '0.2', alpha = 0.5, animated=True);
f_dummy.show();
f_dummy.canvas.draw();
dummy_background = f_dummy.canvas.copy_from_bbox(axes_dummy.bbox);
# [...]
# Update plot data:
def update_data():
line1_data = # Do something with data
line2_data = # Do something with data
f_dummy.canvas.restore_region( dummy_background );
line1.set_ydata(line1_data);
line2.set_ydata(line2_data);
# Update fill data too
axes_dummy.draw_artist(line1);
axes_dummy.draw_artist(line2);
# Draw fill too
f_dummy.canvas.blit( axes_dummy.bbox );
问题是如何在每次调用 update_data() 时根据 line1_data 和 line2_data 更新 fill_between Poly 数据并在 blit 之前绘制它们(“# Update fill data too” & “# Draw fill too”)。我尝试了 fill_lines.set_verts() 但没有成功,找不到示例...
谢谢!
【问题讨论】:
-
您可能需要删除并完全重新绘制每一帧。
*collection对象不适合更新。原因是他们已经丢弃了所有允许您在数据空间和绘图空间之间映射的元数据,并且只保留了要绘制的内容的列表。这是快速渲染它们的权衡。 -
你的意思是在 update_data 中使用 f_dummy.canvas.draw() 吗?我从这个开始,但不幸的是我需要快速绘图,因为我正在实时处理和播放信号,并且我需要绘图不影响播放(调用 draw() 会停止播放)。如果您知道在播放声音时重绘所有内容的快速线程技巧,那就太好了 - 我用 threading.start(...) 调用了 draw。我知道还有其他更快的绘图库,但我更喜欢坚持使用 matplotlib,并且恢复/blit 技巧对我来说足够快。
标签: python animation matplotlib plot