Animación en parcela 3D en Python

Tengo un problema cuando intento animar un complot 3D. Para dar una idea, digamos que he recogido 3 puntos de datos de cada marco de vídeo. Digamos que mi video contiene sólo 5 marcos.

He extraído las coordenadas como sigue por ejemplo;

x = [[1.0,1.2,1.3], [1.2,1.1,1.3], [1.3,1.2,1.0], [1.2,1.1,1.4], [1.2,1.4,1.1]]
y = [[2.0,2.2,2.3], [2.2,2.1,2.3], [2.3,2.2,2.0], [2.2,2.1,2.4], [2.2,2.4,2.1]]
z = [[3.0,3.2,3.3], [3.2,3.1,3.3], [3.3,3.2,3.0], [3.2,3.1,3.4], [2.2,2.4,2.1]]

len(x) = len(y) = len(z) = 5 (# of frames)

que significa en 1st marco, mis coordenadas son (1.0, 2.0, 3.0), (1.2, 2.2, 3.2) & (1.3,2.3, 3.3), en el 2nd marco (1.2,2.2,3.2), (1.1,2.1,3.1) & (1.3,2.3, 3.3) y así sucesivamente. Traté como sigue en el cuaderno de Jupyter; pero sin éxito.

import numpy as np                          
import matplotlib.pyplot as plt            
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation


fig = plt.figure()
ax = p3.Axes3D(fig)
timesteps = 100
border = 2
ax.set_xlim3d([-border, border])
ax.set_ylim3d([-border, border])
ax.set_zlim3d([-border, border])


def animate(i):

    ax.set_xlim3d([-border, border])
    ax.set_ylim3d([-border, border])
    ax.set_zlim3d([-border, border])

    ax.scatter(x[i],y[i],z[i])

anim = animation.FuncAnimation(fig, animate, frames=timesteps, interval=1, blit=False, repeat=False)
anim

Pregunta hecha hace 3 años, 4 meses, 25 días - Por pixelpioneerc4b5


3 Respuestas:

  • Pude resolverlo usando el siguiente enlace: Ve aquí.. Lo pongo aquí si alguien necesita esto en el futuro.

    Respondida el Dec 20, 2020 a las 22:44 - por techscribe

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código puede estar relacionado con la manera en que estás agregando la animación. En tu función animate(i), estás usando ax.scatter para realizar la animación en cada paso de tiempo. Sin embargo, ax.scatter crea un nuevo marcador de dispersión en cada llamada, por lo que en lugar de animar un marcador a través de diferentes posiciones en el espacio, estás creando un nuevo marcador en cada paso de tiempo.

    Para corregir esto, una forma más adecuada de animar un conjunto de puntos en un gráfico 3D sería definir el objeto de dispersión sc una sola vez fuera de la función animate y luego actualizar las posiciones de los puntos en cada llamada a animate.

    Aquí te dejo un ejemplo ajustado de cómo podrías modificar tu código para animar correctamente los puntos en 3D:

    python
    import numpy as np                          
    import matplotlib.pyplot as plt            
    from mpl_toolkits.mplot3d import Axes3D
    import mpl_toolkits.mplot3d.axes3d as p3
    import matplotlib.animation as animation
    
    fig = plt.figure()
    ax = p3.Axes3D(fig)
    timesteps = 5
    border = 4
    ax.set_xlim3d([-border, border])
    ax.set_ylim3d([-border, border])
    ax.set_zlim3d([-border, border])
    
    sc = ax.scatter([], [], [])
    
    def init():
        sc._offsets3d = ([], [], [])
        return sc,
    
    def animate(i):
        sc._offsets3d = [x[i], y[i], z[i]]
        return sc,
    
    anim = animation.FuncAnimation(fig, animate, init_func=init, frames=timesteps, interval=1000, blit=False, repeat=False)
    plt.show()
    

    En este código, he usado el método sc._offsets3d para actualizar las posiciones de los puntos en cada fotograma de la animación. init inicializa los puntos en la posición inicial y animate actualiza las posiciones en cada fotograma.

    Es importante asegurarse de que los tamaños de x, y y z coincidan con el número de fotogramas en timesteps. Espero que esta modificación ayude a solucionar tu problema. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 21, 2020 a las 22:41 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • .

    Respondida el Dec 21, 2020 a las 22:52 - por Gemini

    Votos positivos: 0 | Votos negativos: 0