我有很多多边形,其顶点每次模拟都会移动,在计算完所有新多边形后,必须将它们绘制成matplotlib图。
当代码是静态的时候,我使用路径和补丁来绘制多边形,比如
for polygon in P:
path = Path(polygon)
patch = patches.PathPatch(path, facecolor='none', lw=1)
ax.add_patch(patch)
但当然,在更新多边形时执行此操作会导致绘制最后一个多边形,并且它不是一个干净的更新。多边形的格式是一个带有numpy数组的列表,每个都是多边形的顶点,如[[0.1223, 0.234], [0.123,0.4323], [0.2133, 0.5433]]
我可以绘制没有points = ax.plot(vertices[:,0], vertices[:,1], '.')[0]
行的顶点,并使用points.set_data(...)
更新它们,然后绘制画布。我没有使用FuncAnimation,因为我看到的例子由于FuncAnimation本身而更新数据;在我的例子中,数据是通过迭代生成的,在每次迭代结束时,必须绘制多边形的变化。
答案 0 :(得分:1)
尝试以下示例。它将绘制一个圆圈移动的框。它应该很容易适应您的应用程序。
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
import numpy as np
import math
import time
verts = np.array([[0.,0.],[0.,1.],[1.,1.],[1.,0.],[0.,0.]])
codes = [Path.MOVETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.CLOSEPOLY,
]
path = Path(verts, codes)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
plt.show(block=False)
i=0.0
while i<100:
#for i in range(100):
ax.clear()
x=math.sin(i)
y=math.cos(i)
print x, y
verts2=np.copy(verts)
for j in range(len(verts)):
verts2[j]=verts[j]+np.array([x,y])
path = Path(verts2, codes)
patch = patches.PathPatch(path, facecolor='orange', lw=2)
ax.add_patch(patch)
plt.draw()
i+=0.1