python - 动画 matplotlib 的 Poly3DCollection
问题描述
我想为包含 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。
而是初始化一个浮点数组,例如通过
v = np.meshgrid(range(N),range(N),[0.0])
然后它将按预期工作。
推荐阅读
- split - Excel:将一行拆分并重新排列为 3 行
- django - 为什么我可以从 localhost (vscode) 访问 Django 开发服务器?
- android-studio - Studio BumbleBee 用于 Compose 预览的“渲染问题”
- logging - Android中是否有关于图片制作的日志信息?如果有,保存多长时间?
- kubernetes - Kubernetes 上的 Socket.io 入口控制器(无法建立连接)
- python - send_task() 上的 Celery + Redis 信息
- operating-system - 有没有办法在 LG 或 Blaupunkt 电视上安装我的 .ipk 文件并且我可以反编译它吗?
- java - Java BigDecimal 舍入,而数字中有无意义的 0
- javascript - Puppeteer:TimeoutError:在 Timeout.setTimeout (/home/site/wwwroot/node_modules/puppeteer/lib/helper.js) 等待事件时超时
- python-3.x - 任何人都可以用 eccodes 库和 Xarray 帮助解决这个值错误吗?(我附上了终端的屏幕截图)