Python 为matplotlib'制作动画;s Poly3DCollection

Python 为matplotlib'制作动画;s Poly3DCollection,python,matplotlib,Python,Matplotlib,我想为包含Poly3DCollection的matplotlib绘图设置动画。 我在按指示办事 我开始初始化曲面的面和顶点: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D, art3d from matplotlib.animation import FuncAnimation def init_faces(N): f = [] for r i

我想为包含Poly3DCollection的matplotlib绘图设置动画。 我在按指示办事

我开始初始化曲面的面和顶点:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D, art3d
from matplotlib.animation import FuncAnimation

def init_faces(N):
    f = []
    for r in range(N-1):
        for c in range(N-1):
            v0 = r*N+c
            f.append([v0, v0+1, v0+N+1, v0+N])
    return np.array(f)    

def init_vert(N):
    v = np.meshgrid(range(N),range(N),[0])
    return np.dstack(v).reshape(-1,3)

def set_amplitude(v,A):
    v[:,2] = A * (np.sin(np.pi*v[:,0]/(N-1)) * np.sin(np.pi*v[:,1]/(N-1)))
    return v


N = 10
f = init_faces(N)
v = init_vert(N)
然后初始化该图形

fig = plt.figure()
ax    = fig.add_subplot(1,1,1,projection="3d")

pc = art3d.Poly3DCollection(v[f])
#pc.set_animated(True) # Is this required? Why?

ax.add_collection(pc)
以及更新功能

def init_fig():
    ax.set_xlim([0, N])
    ax.set_ylim([0, N])
    ax.set_zlim([0, 5])
    return pc,

def update_fig(frame):
    A = np.sin(frame)
    new_v = set_amplitude(v,A)
    pc.set_verts(new_v[f])
    return pc,
但是,当我调用动画时,什么也没有发生

ani = FuncAnimation(fig, update_fig, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init_fig, blit=False, repeat=True)

plt.show()
如何修复此问题?

您可以在动画期间打印(v[:,2].max())以发现z始终为0。原因是您初始化了一个整数数组

v = np.meshgrid(range(N),range(N),[0])
因为正弦波和余弦总是较小的一个,所以当转换为整数时,它们保持为0

而是初始化浮点数组,例如通过

v = np.meshgrid(range(N),range(N),[0.0])
然后它将按预期工作。

您可以在动画期间打印(v[:,2].max())以发现z始终为0。原因是您初始化了一个整数数组

v = np.meshgrid(range(N),range(N),[0])
因为正弦波和余弦总是较小的一个,所以当转换为整数时,它们保持为0

而是初始化浮点数组,例如通过

v = np.meshgrid(range(N),range(N),[0.0])
然后它就会像预期的那样工作