我试图在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()
,但没有成功,也找不到示例。
6条答案
按热度按时间s4chpxco1#
好的,正如有人指出的,我们在这里处理的是一个集合,所以我们必须删除和重绘。所以在
update_data
函数的某个地方,删除所有与之关联的集合:并绘制新的“fill_between”多边形集合:
需要类似的技巧将未填充的等值线图覆盖在填充的等值线图上,因为未填充的等值线图也是一个集合(我想是线条的集合?)。
doinxwow2#
这不是我答案,但我发现它最有用:
http://matplotlib.1069221.n5.nabble.com/animation-of-a-fill-between-region-td42814.html
你好,Mauricio,Patch对象比线对象更难处理,因为与线对象不同的是,它是从用户提供的输入数据中删除的一个步骤。下面有一个与你想做的类似的示例:http://matplotlib.org/examples/animation/histogram.html
基本上,你需要在每一帧修改路径的顶点,看起来像这样:
看一下路径。顶点,看看它们是如何排列的。希望这对你有帮助,杰克
hgtggwj03#
如果你不想使用anitmation,或者要从你的图中删除所有的东西来更新只填充,你可以使用这样的方法:
调用
fill_lines.remove()
,然后再次调用axes_dummy.fill_between()
来绘制新的。rsaldnfx4#
初始化pyplot交互模式
在绘制填充时使用可选的label参数:
在我们的脚本后面,我们可以通过标签来删除特定的填充或填充列表,这样就可以逐个对象地创建动画。
您可以对要删除的对象组使用相同的标签;或以其它方式根据需要用标签对标签进行编码
例如,如果我们的填充标记为:
“圆锥1”“圆锥2”“横向1”
我会删除前缀为“cone”的两个词。
也可以采用相同的方式设置线的动画效果
bejyjqdl5#
另一个有效的习惯用法是保存一个绘制对象的列表;此方法似乎适用于任何类型的绘制对象。
h43kikqp6#
与这里的大多数答案相反,每次更新
fill_between
返回的PolyCollection
的数据时,不必删除和重绘它。相反,您可以修改底层Path
对象的vertices
和codes
属性。现在你想用新的数据
xnew
,y0new
和y1new
来更新p
。说明:
path.vertices
包含由fill_between
绘制的面片的顶点,包括附加的开始和结束位置,path.codes
包含如何使用它们的说明(1=将指针移动到,2=将线绘制到,79=闭合多边形)。