在动画中使用Matplotlib-Patch

时间:2014-03-31 20:03:56

标签: python matplotlib

我尝试生成一个空补丁,以便以后能够设置数据。为了更好地解释我的问题,我将举一个例子:

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

x = range(10)
y = [i**2 for i in x]

figure = plt.figure()
ax1 = figure.add_subplot(111, xlim=(0,10), ylim=(0,100))

my_line, = ax1.plot([],[], 'o-')

def init():
    my_line.set_data([], [])
    return my_line,

i = 0

def animate(_):
    global i
    my_line.set_data(x[0:i], y[0:i])
    i = (i+1)%(len(x)+1)   
    return my_line,

ani = animation.FuncAnimation(figure, animate, repeat=True, blit=True, init_func=init)

plt.show()

现在,我要添加一个形状,我随机定义它的边缘点。我需要使用与用于绘制init()块内的行的结构相同的结构:my_line.set_data([], [])。但是,我无法成功。

我使用的结构与matplotlib tutorial中提供的示例相同。我的verts是从函数生成的。

当我尝试使用时:foo = patches.PathPatch([], facecolor='red', lw=2, alpha=0.0)我明白了 <matplotlib.patches.PathPatch at 0x335d390>

但后来,我无法设置路径数据。我尝试使用foo.set_datafoo.set_path,但PathPatch没有这样的属性,因此它们不起作用。我查了this page但我无法到达任何地方。我检查了所有可以找到的教程,但没有一个帮助过。

作为一种解决方法,我使用了ax1.add_patch()命令并将alpha值设置为0.这有一定的延伸但是,由于我必须输入数据才能使用此命令,所有形状都变为在动画的最后一步可见很短的时间,当我在那一刻保存我的身材时,它会产生不利的结果。

任何帮助将不胜感激......

1 个答案:

答案 0 :(得分:1)

我不确定你正在使用什么形状,如果你使用polygon,你可以用set_xy方法更新多边形的顶点,并创建初始多边形,其顶点都等于每个顶点其他。以下示例。如果你需要一个完全任意的形状,你可能最好绘制线条并使用fill_between绘制它。

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

# Create the figure and axis
fig = plt.figure()
ax = plt.axes(xlim=(0, 10), ylim=(0, 10))

# mMke the initial polygon with all vertices set to 0
pts = [[0,0], [0,0], [0,0], [0,0]]
patch = plt.Polygon(pts)
ax.add_patch(patch)

def init():   
    return patch,

def animate(i):
    # Randomly set the vertices
    x1= 5*np.random.rand((1))[0]
    x2= 5*np.random.rand((1))[0] 
    x3= 5*np.random.rand((1))[0] + 5
    x4= 5*np.random.rand((1))[0] + 5

    y1= 5*np.random.rand((1))[0]
    y2= 5*np.random.rand((1))[0] 
    y3= 5*np.random.rand((1))[0] + 5
    y4= 5*np.random.rand((1))[0] + 5

    patch.set_xy([[x1,y1], [x2,y2], [x3,y3], [x4,y4]])

    return patch,

anim = animation.FuncAnimation(fig,animate,init_func=init,frames=36,interval=1000,blit=True)

plt.show()