2 votes

Python, conflit entre l'animation de matplotlib et les lignes en pointillés

Je suis en train d'utiliser python et matplotlib pour créer une animation simple. Mon code est le suivant:

import matplotlib
#matplotlib.use('TkAgg')
from matplotlib import animation as animation
from matplotlib import pyplot as plt
import numpy as np

def w(q): return np.exp(-q**2)

support_q = np.linspace(-10,10,200)
support_q1 = np.linspace(-10,10,30)

list_w = [[w(q-q1) for q in support_q] for q1 in support_q1]

fig = plt.figure()
ax = fig.add_subplot(111, xlabel='q', ylabel='w(q-q\')')
line_w, = ax.plot(support_q, list_w[0])
plt.axhline(dashes=[10], zorder=0)
ax.xaxis.major.locator.set_params(nbins=12)
ax.yaxis.major.locator.set_params(nbins=5)

def animate(i):
    line_w.set_ydata(list_w[i])
    return line_w,

anim = animation.FuncAnimation(fig, animate, frames=len(support_q1), interval=10, blit=False)
#anim.save('animation.mp4')
plt.show()

Le code s'exécute correctement et produit l'animation que je souhaite. Cependant, si j'inclus une commande d'enregistrement anim.save('animation.mp4') juste avant de montrer l'animation, j'obtiens le code d'erreur suivant:

File "/Users/usr1/Library/Python/3.5/lib/python/site-packages/matplotlib/backends/backend_agg.py", line 166, in draw_path
self._renderer.draw_path(gc, path, transform, rgbFace)
ValueError: la séquence de tirets doit avoir un nombre pair d'éléments

Je suis sur Mac OS X. La même erreur exacte se produit si, au lieu d'enregistrer l'animation, j'essaie de changer le backend en TkAgg (en utilisant matplotlib.use('TkAgg')). Changer le backend est une solution de contournement pour les utilisateurs Mac qui veulent utiliser l'option blit=True dans FuncAnimation (voir ici), mais je ne suis pas capable de l'implémenter à cause de cette erreur.

J'ai compris que le problème vient du fait d'ajouter un axe en pointillés au tracé. Autrement dit, si je supprime la ligne

plt.axhline(color='k', dashes=[10], zorder=0)

les deux problèmes disparaissent et il n'y a pas de ValueError.

Est-ce que quelqu'un a une idée de ce qui se passe? Le module d'animation est-il incapable de gérer les lignes en pointillés?

0voto

ImportanceOfBeingErnest Points 119438

Dans TkAgg et Qt4Agg, je peux reproduire l'erreur même sans utiliser d'animation du tout. La raison est en effet la ligne

plt.axhline(dashes=[10])

Dans la documentation nous apprenons que dashes

définit la séquence de tirets, une séquence de tirets en points pour les traits. Si seq est vide ou si seq = (None, None), le style de ligne sera défini sur solide.

Il est désormais clair que [10] n'est pas une séquence de "tiret point", mais seulement "tiret". Une séquence valide contiendrait au moins deux chiffres.

Ainsi, en utilisant une séquence valide, par exemple

plt.axhline(dashes=[10,3])

tout fonctionne sans problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X