Skip to main content
 首页 » 编程设计

python之动画 matplotlib 的 Poly3DCollection

2025年05月04日13telwanggs

我想为包含 Poly3DCollection 的 matplotlib 图制作动画。 我正在按照 https://matplotlib.org/3.1.0/api/animation_api.html 上的说明进行操作

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

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() 

我该如何解决这个问题?

请您参考如下方法:

你可以在动画中print(v[:,2].max())发现z一直为0,原因是你初始化了一个整型数组

v = np.meshgrid(range(N),range(N),[0]) 

并且由于 sin 和 cos 总是较小的一个,因此当转换为整数时它们保持为 0。

改为初始化一个 float 组,例如通过

v = np.meshgrid(range(N),range(N),[0.0]) 

然后它将按预期工作。