2013-08-20 4 views
15

J'ai un diagramme de dispersion mis en place et tracé comme je le veux, et je veux créer une vidéo .mp4 de la figure tournant dans l'espace, comme si j'avais utilisé plt.show() et fait glisser le point de vue autour.Animer un graphe 3D tournant dans matplotlib

This answer est presque exactement ce que je veux, sauf pour enregistrer un film que je devrais appeler manuellement dans FFMpeg avec un dossier d'images. Au lieu de sauvegarder des images individuelles, je préférerais utiliser le support d'animation intégré de Matplotlib. Code reproduit ci-dessous:

from mpl_toolkits.mplot3d import Axes3D 
ax = Axes3D(fig) 
ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6) 
for ii in xrange(0,360,1): 
    ax.view_init(elev=10., azim=ii) 
    savefig("movie"%ii+".png") 
+0

A travaillé parfaitement, merci! – Nate

Répondre

20

Si vous voulez en savoir plus, vous devriez vraiment suivre this tutorial à propos matplotlib animations. Il explique en détail comment créer des graphiques animés.

Note: Création des parcelles d'animation nécessitent ffmpeg ou mencoder à installer.

Voici une version de son premier exemple modifié pour fonctionner avec votre nuage de points.

# First import everthing you need 
import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
from mpl_toolkits.mplot3d import Axes3D 

# Create some random data, I took this piece from here: 
# http://matplotlib.org/mpl_examples/mplot3d/scatter3d_demo.py 
def randrange(n, vmin, vmax): 
    return (vmax - vmin) * np.random.rand(n) + vmin 
n = 100 
xx = randrange(n, 23, 32) 
yy = randrange(n, 0, 100) 
zz = randrange(n, -50, -25) 

# Create a figure and a 3D Axes 
fig = plt.figure() 
ax = Axes3D(fig) 

# Create an init function and the animate functions. 
# Both are explained in the tutorial. Since we are changing 
# the the elevation and azimuth and no objects are really 
# changed on the plot we don't have to return anything from 
# the init and animate function. (return value is explained 
# in the tutorial. 
def init(): 
    ax.scatter(xx, yy, zz, marker='o', s=20, c="goldenrod", alpha=0.6) 
    return fig, 

def animate(i): 
    ax.view_init(elev=10., azim=i) 
    return fig, 

# Animate 
anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=360, interval=20, blit=True) 
# Save 
anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264']) 
+1

Désolé, j'espère que vous n'êtes pas offensé. Je ne suis pas sûr d'être d'accord avec vous sur le manque de valeurs de retour. Je pense que «blit» a besoin d'eux pour fonctionner correctement, mais cette section de la bibliothèque est encore un peu une boîte noire pour moi. (J'ai fait voter la réponse). – tacaswell

+1

Bien sûr que non! : D Je respecte vraiment beaucoup vos commentaires, car ils proviennent d'un développeur expérimenté de 'matplotlib'! Et j'essaie d'apprendre d'eux et de me comporter selon vos suggestions (hier à propos de la question). Alors s'il vous plaît ** DO ** corrigez-moi chaque fois que vous pensez que j'ai fait quelque chose de mal :). C'est à la fois dans l'intérêt de la communauté des SO et de mon propre processus d'apprentissage. Il est arrivé que nous ayons eu un léger désaccord sur la méthodologie de la question précédente, donc j'ai ajouté cela comme une blague puisque je savais que vous liriez toutes les questions 'matplotlib' :) –

+0

A propos de la valeur de retour. Dans l'article du blog, Jake a déclaré: "Il est important que cette fonction renvoie l'objet ligne, car cela indique à l'animateur quels objets sur le tracé doivent être mis à jour après chaque image". Mais puisque aucun des objets sur l'intrigue ne change, j'ai supposé que rien ne devrait être retourné. Je vais modifier le post si c'est une hypothèse incorrecte. –

Questions connexes