我尝试生成一个空补丁,以便以后能够设置数据。为了更好地解释我的问题,我将举一个例子:
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_data
和foo.set_path
,但PathPatch没有这样的属性,因此它们不起作用。我查了this page但我无法到达任何地方。我检查了所有可以找到的教程,但没有一个帮助过。
作为一种解决方法,我使用了ax1.add_patch()
命令并将alpha值设置为0.这有一定的延伸但是,由于我必须输入数据才能使用此命令,所有形状都变为在动画的最后一步可见很短的时间,当我在那一刻保存我的身材时,它会产生不利的结果。
任何帮助将不胜感激......
答案 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()