Matplotlib动画填充形状之间

Seb*_*ian 12 python plot animation matplotlib

我试图在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 );
Run Code Online (Sandbox Code Playgroud)

问题是每次调用update_data()时如何更新基于line1_data和line2_data的fill_between数据,并在blit之前绘制它们("#Ump fill data too"&"#Draw fill too").我尝试了fill_lines.set_verts()但没有成功,找不到一个例子......

谢谢!

mey*_*son 7

好的,正如有人指出的那样,我们在这里处理集合,因此我们将不得不删除并重新绘制。因此update_data,请删除该函数中与之关联的所有集合:

axes_dummy.collections.clear()
Run Code Online (Sandbox Code Playgroud)

并绘制新的“ fill_between” PolyCollection:

axes_dummy.fill_between(x, y-sigma, y+sigma, facecolor='yellow', alpha=0.5)
Run Code Online (Sandbox Code Playgroud)

将未填充的轮廓图叠加在已填充的轮廓图上也需要类似的技巧,因为未填充的轮廓图也属于Collection(我想是吗?)。

  • 如果您只想删除一个集合,则可以使用 `coll.get_label()` 来获取正确的集合,前提是您已先标记了该集合。 (2认同)

den*_*ufa 5

这不是我的答案,但我发现它最有用:

http://matplotlib.1069221.n5.nabble.com/animation-of-a-fill-between-region-td42814.html

嗨 Mauricio, Patch 对象比线对象更难使用,因为与线对象不同的是从用户提供的输入数据中删除了一个步骤。有一个类似于你想在这里做的例子:http : //matplotlib.org/examples/animation/histogram.html

基本上,您需要在每一帧修改路径的顶点。它可能看起来像这样:

from matplotlib import animation
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set_xlim([0,10000])

x = np.linspace(6000.,7000., 5)
y = np.ones_like(x)

collection = plt.fill_between(x, y)

def animate(i):
    path = collection.get_paths()[0]
    path.vertices[:, 1] *= 0.9

animation.FuncAnimation(fig, animate,
                        frames=25, interval=30)
Run Code Online (Sandbox Code Playgroud)

查看 path.vertices 以了解它们的布局。希望有所帮助,杰克