python animation.FuncAnimation error : object is not iterable
python animation.FuncAnimation error : object is not iterable
我是Python新手,正在研究matplotlib
使用动画功能。
由于我的学习,我正在关注 qutip
教程。
但是当我复制并粘贴 qutip
教程的示例代码时,它不起作用
错误消息是 Axes3D object is not iterable
.
所以,我想检查我创建的代码,但不知道问题是我的代码还是其他问题。
我不知道该怎么做,想知道为什么示例代码不起作用。
这是教程中的示例代码:
from qutip import *
from scipy import *
def qubit_integrate(w, theta, gamma1, gamma2, psi0, tlist):
sx = sigmax(); sy = sigmay(); sz = sigmaz(); sm = sigmam()
H = w * (cos(theta) * sz + sin(theta) * sx)
c_op_list = []
n_th = 0.5 # temperature
rate = gamma1 * (n_th + 1)
if rate > 0.0: c_op_list.append(sqrt(rate) * sm)
rate = gamma1 * n_th
if rate > 0.0: c_op_list.append(sqrt(rate) * sm.dag())
rate = gamma2
if rate > 0.0: c_op_list.append(sqrt(rate) * sz)
output = mesolve(H, psi0, tlist, c_op_list, [sx, sy, sz])
return output.expect[0], output.expect[1], output.expect[2]
w = 1.0 * 2 * pi # qubit angular frequency
theta = 0.2 * pi # qubit angle from sigma_z axis (toward sigma_x axis)
gamma1 = 0.5 # qubit relaxation rate
gamma2 = 0.2 # qubit dephasing rate
a = 1.0
psi0 = (a* basis(2,0) + (1-a)*basis(2,1))/(sqrt(a**2 + (1-a)**2))
tlist = linspace(0,4,250)
sx, sy, sz = qubit_integrate(w, theta, gamma1, gamma2, psi0, tlist)
from pylab import *
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D
fig = figure()
ax = Axes3D(fig,azim=-40,elev=30)
sphere = Bloch(axes=ax)
def animate(i):
sphere.clear()
sphere.add_vectors([np.sin(theta),0,np.cos(theta)])
sphere.add_points([sx[:i+1],sy[:i+1],sz[:i+1]])
sphere.make_sphere()
return ax
def init():
sphere.vector_color = ['r']
return ax
ani = animation.FuncAnimation(fig, animate, np.arange(len(sx)),
init_func=init, blit=True, repeat=False)
ani.save('bloch_sphere.mp4', fps=20, clear_temp=True)
这是我自己的代码:
import numpy as np
import qutip as q
import scipy as sp
up=q.basis(2,0)
sx=q.sigmax()
sy=q.sigmay()
sz=q.sigmaz()
bz=0.
by=0.
bx=15.
w=np.pi/20
H=w*(sx*bx+sy*by+sz*bz)
def state(t):
states=[q.Qobj.expm(-(0+1j)*H*t)*up]
return states
import matplotlib.pyplot as plt
import matplotlib.animation as ani
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()
ax=Axes3D(fig,azim=-40,elev=30)
sphere=q.Bloch(axes=ax)
sphere.add_states(up)
def ini():
sphere.vector_color=("r")
return ax
t=np.linspace(0,1,256)
def animate(i):
sphere.clear()
sphere.add_states(state[i])
return ax
ani.FuncAnimation(fig,animate,frames=len(t),init_func=ini,blit=True,repeat=False)
plt.show()
修复教程
删除 blit
参数以使教程有效:
ani = animation.FuncAnimation(fig, animate, np.arange(len(sx)),
init_func=init, repeat=False)
plt.show()
ani.save('bloch_sphere.mp4', fps=20)
修正你的例子
frames
必须是可迭代的。
变化:
frames=len(t)
进入:
frames=t
即,这一行:
ani.FuncAnimation(fig, animate, frames=len(t), init_func=ini, blit=True, repeat=False)
应该变成这样:
ani.FuncAnimation(fig, animate, frames=t, init_func=ini, blit=True, repeat=False)
还有一些变化。
- 用副合成调用你的函数 stare
state(i)
而不是用方括号 state[i]
- 保留对动画的引用
ani = ani.FuncAnimation
完整代码:
def animate(i):
sphere.clear()
sphere.add_states(state(i))
sphere.make_sphere()
return ax
ani = ani.FuncAnimation(fig, animate, frames=t, init_func=ini, repeat=False)
plt.show()
这是动画的结束状态:
除了删除 blit=True
参数外,我还必须将 writer 字符串值更改为“ffmpeg”(当然还安装了 ffmpeg 包,还通过 pip 安装了 opencv 包但不确定是必需的)。
anim.save(name + '.mp4', fps=10, writer="ffmpeg", codec=codec)
我是Python新手,正在研究matplotlib
使用动画功能。
由于我的学习,我正在关注 qutip
教程。
但是当我复制并粘贴 qutip
教程的示例代码时,它不起作用
错误消息是 Axes3D object is not iterable
.
所以,我想检查我创建的代码,但不知道问题是我的代码还是其他问题。
我不知道该怎么做,想知道为什么示例代码不起作用。
这是教程中的示例代码:
from qutip import *
from scipy import *
def qubit_integrate(w, theta, gamma1, gamma2, psi0, tlist):
sx = sigmax(); sy = sigmay(); sz = sigmaz(); sm = sigmam()
H = w * (cos(theta) * sz + sin(theta) * sx)
c_op_list = []
n_th = 0.5 # temperature
rate = gamma1 * (n_th + 1)
if rate > 0.0: c_op_list.append(sqrt(rate) * sm)
rate = gamma1 * n_th
if rate > 0.0: c_op_list.append(sqrt(rate) * sm.dag())
rate = gamma2
if rate > 0.0: c_op_list.append(sqrt(rate) * sz)
output = mesolve(H, psi0, tlist, c_op_list, [sx, sy, sz])
return output.expect[0], output.expect[1], output.expect[2]
w = 1.0 * 2 * pi # qubit angular frequency
theta = 0.2 * pi # qubit angle from sigma_z axis (toward sigma_x axis)
gamma1 = 0.5 # qubit relaxation rate
gamma2 = 0.2 # qubit dephasing rate
a = 1.0
psi0 = (a* basis(2,0) + (1-a)*basis(2,1))/(sqrt(a**2 + (1-a)**2))
tlist = linspace(0,4,250)
sx, sy, sz = qubit_integrate(w, theta, gamma1, gamma2, psi0, tlist)
from pylab import *
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D
fig = figure()
ax = Axes3D(fig,azim=-40,elev=30)
sphere = Bloch(axes=ax)
def animate(i):
sphere.clear()
sphere.add_vectors([np.sin(theta),0,np.cos(theta)])
sphere.add_points([sx[:i+1],sy[:i+1],sz[:i+1]])
sphere.make_sphere()
return ax
def init():
sphere.vector_color = ['r']
return ax
ani = animation.FuncAnimation(fig, animate, np.arange(len(sx)),
init_func=init, blit=True, repeat=False)
ani.save('bloch_sphere.mp4', fps=20, clear_temp=True)
这是我自己的代码:
import numpy as np
import qutip as q
import scipy as sp
up=q.basis(2,0)
sx=q.sigmax()
sy=q.sigmay()
sz=q.sigmaz()
bz=0.
by=0.
bx=15.
w=np.pi/20
H=w*(sx*bx+sy*by+sz*bz)
def state(t):
states=[q.Qobj.expm(-(0+1j)*H*t)*up]
return states
import matplotlib.pyplot as plt
import matplotlib.animation as ani
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()
ax=Axes3D(fig,azim=-40,elev=30)
sphere=q.Bloch(axes=ax)
sphere.add_states(up)
def ini():
sphere.vector_color=("r")
return ax
t=np.linspace(0,1,256)
def animate(i):
sphere.clear()
sphere.add_states(state[i])
return ax
ani.FuncAnimation(fig,animate,frames=len(t),init_func=ini,blit=True,repeat=False)
plt.show()
修复教程
删除 blit
参数以使教程有效:
ani = animation.FuncAnimation(fig, animate, np.arange(len(sx)),
init_func=init, repeat=False)
plt.show()
ani.save('bloch_sphere.mp4', fps=20)
修正你的例子
frames
必须是可迭代的。
变化:
frames=len(t)
进入:
frames=t
即,这一行:
ani.FuncAnimation(fig, animate, frames=len(t), init_func=ini, blit=True, repeat=False)
应该变成这样:
ani.FuncAnimation(fig, animate, frames=t, init_func=ini, blit=True, repeat=False)
还有一些变化。
- 用副合成调用你的函数 stare
state(i)
而不是用方括号state[i]
- 保留对动画的引用
ani = ani.FuncAnimation
完整代码:
def animate(i):
sphere.clear()
sphere.add_states(state(i))
sphere.make_sphere()
return ax
ani = ani.FuncAnimation(fig, animate, frames=t, init_func=ini, repeat=False)
plt.show()
这是动画的结束状态:
除了删除 blit=True
参数外,我还必须将 writer 字符串值更改为“ffmpeg”(当然还安装了 ffmpeg 包,还通过 pip 安装了 opencv 包但不确定是必需的)。
anim.save(name + '.mp4', fps=10, writer="ffmpeg", codec=codec)