在动画中初始化和旋转补丁的正确方法是什么?附加的程序在动画中初始化和旋转补丁,但我的解决方案是一种kludge。
为了保持初始化的补丁不会显示为静态补丁,我设置alpha = 0,但这意味着每次调用animate函数时都必须设置alpha = 1,而我只需要设置一次。我可以输入一个“if i == 0;”在set_alpha(1)调用之前的语句,但这似乎不够优雅。
要旋转补丁,我使用“mag1._angle = i”(参见第37行和第39行),它使用Rectangle的内部属性_angle。你真的不应该这样做,但我没有看到另一种简单的解决方案。 Pythonistas说了什么?
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
fig = plt.figure()
ax = plt.axes(xlim=(-1, 1), ylim=(-1, 1), aspect=1)
ax.set_xticks([])
ax.set_yticks([])
r_in, r_out = 0.25, 0.35
circ_outer = plt.Circle((0, 0), radius=r_out, ec='blue', fc='white', lw=3)
circ_inner = plt.Circle((0, 0), radius=r_in, ec='blue', fc='white', lw=3)
ax.add_patch(circ_outer)
ax.add_patch(circ_inner)
r, w, h = 0.5, 0.07, 0.4
x0, y0 = r, 0.5*h
mag1 = plt.Rectangle((-x0,-y0), width= w, height= h, angle=0, fc='black', alpha=0)
mag2 = plt.Rectangle(( x0, y0), width=-w, height=-h, angle=0, fc='black', alpha=0)
line1, = ax.plot([], [], 'b', zorder=1)
line2, = ax.plot([], [], 'b', zorder=1)
def init():
line1.set_data([], [])
line2.set_data([], [])
ax.add_patch(mag1)
ax.add_patch(mag2)
return mag1, mag2, line1, line2,
def animate(i):
mag1.set_alpha(1)
mag2.set_alpha(1)
thetaMAG = np.radians(i)
x = x0*np.cos(thetaMAG) - y0*np.sin(thetaMAG)
y = x0*np.sin(thetaMAG) + y0*np.cos(thetaMAG)
mag1.xy = (-x, -y)
mag1._angle = i
mag2.xy = (x, y)
mag2._angle = i
j = float(i)/3.0
thetaROT = np.radians(j)
sn = r_in*np.sin(thetaROT)
cs = r_in*np.cos(thetaROT)
line1.set_data([-cs, cs], [-sn, sn])
line2.set_data([sn, -sn], [-cs, cs])
return mag1, mag2, line1, line2,
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=1080,
interval=25, blit=True)
plt.show()