9
votes

Mise à jour des valeurs de l'axe des X à l'aide d'animation MATPLOTLIB

J'essaie d'utiliser matplotlib.artistanimation code> pour animer deux sousplots. Je souhaite que l'axe des X augmente la valeur que l'animation progresse, de sorte que la longueur totale de l'animation soit 100 mais à tout moment, le sous-champ ne me présente que les valeurs de temps de 0 à 24, puis comporte jusqu'à 100.

Un excellent exemple est donné ici . Le lien utilise FunCanimation CODE> et met à jour les étiquettes de l'axe X dans une mode roulante à l'aide de tracé (). Axes.set_xlim () code> et incrémentation des valeurs x. Le code est disponible via le lien ci-dessous la vidéo YouTube dans le lien fourni. P>

J'ai annexé le code ci-dessous qui montre mes tentatives de reproduction de ces résultats, mais les X-LIMITS semblent prendre leurs valeurs finales au lieu de incrémentation avec le temps. J'ai également essayé d'incrémenter la solution (par opposition à l'axe) en traitant uniquement les valeurs de la fenêtre qui seront visibles dans le sous-champ, mais cela n'écriment pas les valeurs d'axe des x. J'ai également essayé d'implémenter l'autocaling mais l'axe X ne met toujours pas à jour. P>

J'ai aussi trouvé cette question qui est pratiquement le même problème, mais la question n'a jamais été répondue. p>

Voici mon code: P>

import matplotlib.pylab as plt
import matplotlib.animation as anim
import numpy as np

#create image with format (time,x,y)
image = np.random.rand(100,10,10)

#setup figure
fig = plt.figure()
ax1=fig.add_subplot(1,2,1)
ax2=fig.add_subplot(1,2,2)
#set up viewing window (in this case the 25 most recent values)
repeat_length = (np.shape(image)[0]+1)/4
ax2.set_xlim([0,repeat_length])
#ax2.autoscale_view()
ax2.set_ylim([np.amin(image[:,5,5]),np.amax(image[:,5,5])])

#set up list of images for animation

ims=[]
for time in xrange(np.shape(image)[0]):

    im = ax1.imshow(image[time,:,:])
    im2, = ax2.plot(image[0:time,5,5],color=(0,0,1))
    if time>repeat_length:
        lim = ax2.set_xlim(time-repeat_length,time)

    ims.append([im, im2])


#run animation
ani = anim.ArtistAnimation(fig,ims, interval=50,blit=False)
plt.show()


3 Réponses :


0
votes

Cela déplace votre axe, mais est très lent. XXX


1 commentaires

Vous n'avez pas besoin de ré-créer les objets imshow à chaque fois, utilisez set_data à la place.



9
votes

Si vous ne pas besoin de blâmer xxx

fonctionnera.

Si vous devez exécuter plus rapidement, vous devez jouer à des jeux avec la boîte de sélection utilisée pour le blâmer de manière à ce que les étiquettes des axes soient mises à jour.


1 commentaires

J'espérais que je pourrais le faire courir en utilisant l'artisanimation mais éventuellement mordre la balle et réécrit le code. Il semble courir en douceur.



1
votes

Si vous utilisez un blindage, vous pouvez appeler pyplot.draw () pour redessiner toute la figure, chaque fois que vous modifiez l'axe Y / x.

Ceci met à jour la figure entière, de sorte que relativement lent, mais il est acceptable si vous n'appelez pas de nombreux articles.


0 commentaires