Анимация matplotlib's Poly3DCollection - PullRequest
2 голосов
/ 05 июля 2019

Я хотел бы анимировать график matplotlib, содержащий Poly3DCollection. Я следую инструкциям на 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()

Как я могу это исправить?

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете 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])

Тогда все будет работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...