我想动画matplotlib内的fill_between形状,我不知道如何更新PolyCollection的数据。以这个简单的例子:我有两条线,我总是在它们之间填充。当然,这些线条会变化并且是动态的。Matplotlib动画fill_between形状
这里是一个虚拟的例子:
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);
的问题是如何更新基于line1_data的fill_between聚数据和line2_data每次update_data()被调用和块传输之前吸引他们(“#更新填充数据太“&”#绘制填充太“)。我试图fill_lines.set_verts()没有成功,并找不到示例...
谢谢!
您可能需要删除并完全重新绘制每一帧。 '* collection'对象在更新时不起作用。原因是他们抛弃了所有可以让你在数据空间和绘图空间之间进行映射的元数据,并且只保留一张要绘制的内容列表。这是一个权衡以迅速呈现它们。 – tacaswell 2013-04-21 06:13:22
你的意思是在update_data中使用f_dummy.canvas.draw()吗?我从此开始,但不幸的是我需要快速绘图,因为我正在处理和实时播放信号,并且需要绘图不会影响播放(调用draw()会阻止播放)。如果你在播放声音时知道一个快速的线程技巧来重绘所有的东西,那就好了 - 我用threading.start(...)调用draw。我知道还有其他更快的绘图库,但我更愿意坚持使用matplotlib,并且恢复/ blit技巧对我来说足够快。 – Sebastian 2013-04-23 13:27:18