À l'aide de matplotlib.animer pour animer un tracé de contour en python
J'ai un tableau 3D de données (2 dimensions spatiales et 1 dimension de temps) et je suis en train de produire une animation tracé de contour à l'aide de matplotlib.animer. Je suis l'aide de ce lien comme une base:
http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/
Et voici ma tentative:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
from numpy import array, zeros, linspace, meshgrid
from boutdata import collect
# First collect data from files
n = collect("n") # This is a routine to collect data
Nx = n.shape[1]
Nz = n.shape[2]
Ny = n.shape[3]
Nt = n.shape[0]
fig = plt.figure()
ax = plt.axes(xlim=(0, 200), ylim=(0, 100))
cont, = ax.contourf([], [], [], 500)
# initialisation function
def init():
cont.set_data([],[],[])
return cont,
# animation function
def animate(i):
x = linspace(0, 200, Nx)
y = linspace(0, 100, Ny)
x,y = meshgrid(x,y)
z = n[i,:,0,:].T
cont.set_data(x,y,z)
return cont,
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=200, interval=20, blit=True)
plt.show()
Mais quand je fais cela, j'obtiens l'erreur suivante:
Traceback (most recent call last):
File "showdata.py", line 16, in <module>
cont, = ax.contourf([], [], [], 500)
File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 7387, in contourf
return mcontour.QuadContourSet(self, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1112, in __init__
ContourSet.__init__(self, ax, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 703, in __init__
self._process_args(*args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1125, in _process_args
x, y, z = self._contour_args(args, kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1172, in _contour_args
x,y,z = self._check_xyz(args[:3], kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1204, in _check_xyz
raise TypeError("Input z must be a 2D array.")
TypeError: Input z must be a 2D array.
J'ai donc essayé de remplacer toutes les [] par [[], []], mais ce produit:
Traceback (most recent call last):
File "showdata.py", line 16, in <module>
cont, = ax.contourf([[],[]], [[],[]], [[],[]],500)
File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 7387, in contourf
return mcontour.QuadContourSet(self, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1112, in __init__
ContourSet.__init__(self, ax, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 703, in __init__
self._process_args(*args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1125, in _process_args
x, y, z = self._contour_args(args, kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1177, in _contour_args
self.zmax = ma.maximum(z)
File "/usr/lib/python2.7/dist-packages/numpy/ma/core.py", line 5806, in __call__
return self.reduce(a)
File "/usr/lib/python2.7/dist-packages/numpy/ma/core.py", line 5824, in reduce
t = self.ufunc.reduce(target, **kargs)
ValueError: zero-size array to maximum.reduce without identity
Merci d'avance!
OriginalL'auteur Luke | 2013-06-04
Vous devez vous connecter pour publier un commentaire.
C'est ce que j'ai eu à travailler:
J'ai trouvé que la suppression de la blit=0 argument dans le FuncAnimation appel a également aidé...
OriginalL'auteur Luke
Felix Schneider est correcte sur l'animation en train de devenir très lent. Sa solution de réglage
ax.collections = []
supprime tous les vieux (et dépassée) "artiste". Plus l'approche chirurgicale est à seulement supprimer les artistes impliqués dans le dessin des courbes de niveau:ce qui est utile dans les cas les plus compliqués, en lieu et place de la reconstruction de l'ensemble de la figure pour chaque image. Cela fonctionne aussi dans Rehman Ali exemple; au lieu de dégager la figure entière avec
clf()
la valeur retournée parcontourf()
est enregistré et utilisé dans la prochaine itération.Voici un exemple de code similaire à Luc de Jun 7 '13, démontrant enlever les contours seulement:
OriginalL'auteur Patrick Pribyl
C'est la ligne:
changement:
Vous devez intilize avec la taille des tableaux.
La droite. Juste mettre les données à partir du début. Les moûts qui se passe que vous avez mis deux fois. Ne pas vous blesser souvent dans l'animation de toute façon. Mise à jour de la réponse.
Avez-vous travailler?
OriginalL'auteur Mike Müller
Ici est une autre façon de faire la même chose si matplotlib.l'animation ne fonctionne pas pour vous. Si vous voulez mettre à jour en permanence la barre de couleur et tout le reste de la figure, l'utilisation de plt.ion() au tout début pour permettre interactif de traçage et d'utiliser un combo de plt.draw() et plt.clf() pour mettre à jour continuellement l'intrigue.
Notez que cela fonctionne avec les chiffres contenant différentes sous-intrigues et les différents types de parcelles (c'est à dire polaires ou cartésiennes)
OriginalL'auteur Rehman Ali
J'ai regardé ça il y a longtemps. Je ma situation, j'ai eu un peu de sous-intrigues avec des contours qui je voulais animer. Je ne voulais pas utiliser le plt.clf() solution Rehman ali suggérer comme j'ai utilisé une configuration particulière de mon axe (avec pi, symboles, etc) qui serait nettoyé ainsi, j'ai donc préféré le " remove()' approche suggèrent Felix. Le truc, c'est qu'en utilisant "supprimer" ne pas nettoyer la mémoire et de la bouche de votre ordinateur, et donc vous devez explicitement supprimer les contours en le définissant par une liste vide.
Afin d'avoir un générique supprimer la routine qui est capable d'enlever les contours ainsi que les textes, j'ai écrit la routine "clean_up_artists' que vous devriez utiliser sur tous les pas de temps sur l'ensemble de l'axe.
Cette routine nettoie les artistes qui sont passés dans une liste appelée "artist_list" dans un axe 'axis'. Cela signifie que pour l'animation de plusieurs sous-intrigues, nous avons besoin de stocker les listes des artistes pour chaque axe, nous avons besoin de nettoyer chaque pas de temps.
Ci-dessous le code complet pour animer un certain nombre de sous-intrigues de données aléatoires. C'est assez explicite, alors j'espère qu'il devient clair ce qui se passe. De toute façon, j'ai juste pensé à le publier, car il combine plusieurs idées que j'ai trouvé sur un débordement de pile, que je viens de venir avec cet exemple de travail.
Quelqu'un avec des suggestions pour améliorer le code, s'il vous plaît shoot-)
OriginalL'auteur Eelco van Vliet
Retrait de la blit=0 ou blit = True argument dans le FuncAnimation appel a également aidé
c'est important!!!
OriginalL'auteur Qina Yan
J'ai utilisé Lukes approche (à partir du 7 Juin '13 à 8:08 ), mais il a ajouté
juste avant
Sinon je l'ai vécu la création de l'animation va devenir très lent pour les grands numéros de châssis.
OriginalL'auteur Felix Schneider