Matplotlib动画补丁初始化和旋转。怎么做对了?

时间:2014-04-20 17:14:33

标签: python animation matplotlib

在动画中初始化和旋转补丁的正确方法是什么?附加的程序在动画中初始化和旋转补丁,但我的解决方案是一种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()

0 个答案:

没有答案