如何使用 Python 和 Matplotlib 为多边形(由数组定义)设置动画

问题解释: 我想为从数组接收的值设置动画多边形(在我的简单示例中,它是一个移动的正方形)。我想保持多边形的 x 和 y 值可变。不要担心多边形做了什么运动。这只是一个例子。需要使用“set_xy()”,就像在“使用 matplotlib的动画转换多边形”的解决方案中一样。


目标-> 在每个动画帧中,我想从数组 (P1x,P1y,P2x,P2y,...) 加载多边形值并更新图形。


问题: 在我的代码中,我仍然有使用补丁的问题。我正在尝试使用索引 i 更新多边形值。我必须如何定义补丁?这是否必须在动画调用之前完成?


import matplotlib.pyplot as plt

import numpy as np

import matplotlib.animation as animation

import matplotlib.patches as patches


fig = plt.figure()

ax = fig.add_subplot(111)

ax.set_xlim(-10,10)

ax.set_ylim(-10,10)


P1x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]

P1y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]

P2x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]

P2y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]

P3x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]

P3y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]

P4x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]

P4y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]


def init():

    return patch,


def animate(i):

    v = np.array([

                [P1x[i],  P1y[i]],  

                [P2x[i],  P2y[i]],  

                [P3x[i],  P3y[i]],

                [P4x[i],  P4y[i]]

                ])

    patch=patches.Polygon(v,closed=True, fc='r', ec='r')


    return patch,


ani = animation.FuncAnimation(fig, animate, np.arange(1, 5), init_func=init,

                              interval=1000, blit=True)

plt.show()

非常感谢你的帮助!


Smart猫小萌
浏览 207回答 1
1回答

忽然笑

是的,您需要先创建多边形并将其添加到轴上。在动画函数中,您可以使用补丁的patch.set_xy()方法来更新多边形的顶点。import matplotlib.pyplot as pltimport numpy as npimport matplotlib.animation as animationimport matplotlib.patches as patchesfig = plt.figure()ax = fig.add_subplot(111)ax.set_xlim(-10,10)ax.set_ylim(-10,10)P1x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]P1y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]P2x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]P2y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]P3x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]P3y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]P4x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]P4y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]P = np.concatenate((np.array([P1x, P2x, P3x, P4x]).reshape(4,1,len(P1x)),                    np.array([P1y, P2y, P3y, P4y]).reshape(4,1,len(P1x))), axis=1)patch = patches.Polygon(P[:,:,0],closed=True, fc='r', ec='r')ax.add_patch(patch)def init():    return patch,def animate(i):    patch.set_xy(P[:,:,i])    return patch,ani = animation.FuncAnimation(fig, animate, np.arange(P.shape[2]), init_func=init,                              interval=1000, blit=True)plt.show()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python