Python Matplotlib se bloque lorsqu'il est invité à tracer un deuxième graphique (après la fermeture de la première fenêtre du graphique)

StackOverflow https://stackoverflow.com/questions/1219394

  •  10-07-2019
  •  | 
  •  

Question

Un comportement étrange, je suis sûr que c'est moi qui déconne, mais j'aimerais aller au fond de ce qui se passe:

J'utilise le code suivant pour créer une fenêtre graphique très simple à l'aide de matplotlib:

>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> ax.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x0290B750>]
>>> plt.show()

et comme prévu, j'obtiens le graphique auquel on peut s'attendre, dans une nouvelle fenêtre qui apparaît, contenant une très simple ligne bleue allant de 1 à 3 à 1 à nouveau sur l'axe des y, avec 0, 1, 2 comme points d'axe x (juste à titre d'exemple). Maintenant, je ferme la fenêtre graphique (en utilisant le bouton en croix en haut à droite sous les fenêtres). Cela me donne le contrôle de l'interprète et je recommence en créant de nouveaux objets:

>>>
>>> fig1 = plt.figure()
>>> bx = fig1.add_subplot(111)
>>> bx.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x029E8210>]
>>> plt.show()

Cette fois, j’ai un cadre de fenêtre dans lequel il n’ya rien (rien que le cadre, rien d’arrière-plan blanc), et tout le tournage est bloqué. Je dois "terminer la tâche", l'interpréteur python est arrêté par le système et je reçois une invite de commande. Comportement similaire sur un Mac (sauf qu'il trace en fait le graphique en premier, avant de se suspendre).

Donc, d’une manière ou d’une autre, Python et / ou matplotlib ne veulent pas que je ferme la fenêtre manuellement. Quelqu'un sait ce qui se passe et ce que je devrais faire? Ce que j'aimerais faire, c'est jouer avec différentes parcelles au sein de l'interprète, et ce comportement n'aide évidemment pas. Je sais que je pourrais utiliser "Ipython -pylab". mais dans l'intérêt d'apprendre, je veux comprendre l'erreur ci-dessus.

Merci.

Était-ce utile?

La solution

Apparemment, cela est dû à un bug dans le backend de tkinter. Voir, par exemple, https://bugs.launchpad.net/ubuntu/ + source / matplotlib / + bug / 313834 . C'est en cours de travail ... Si vous pouvez revenir à une bibliothèque tkinter légèrement plus ancienne, cela devrait être une solution de rechange pour le moment (j'ai rencontré la même chose il y a quelques semaines et c'était mon seul espoir).

Autres conseils

Trois mois de retard pour la fête, mais j’ai trouvé dans la documentation de matlibplot une suggestion consistant à utiliser draw () plutôt que show (); apparemment, le premier ne fait que restituer l’intrigue actuelle, tandis que le second lance tous les outils interactifs, c’est là que les problèmes semblent se poser.

Ce n’est pas très bien placé dans la documentation, mais voici le lien: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

Pour ce que cela vaut, j’ai essayé pylab.show () et je vous ai posé exactement le même problème que vous, alors que pylab.draw () semble fonctionner correctement si je veux juste voir le résultat.

Avez-vous essayé d'utiliser ipython à la place de l'interpréteur python standard?

Vous pouvez installer ipython à l'aide de la commande suivante:

easy_install ipython

et ensuite, ipython a un mode spécifique à exécuter avec pylab, appelé -pylab:

ipython -pylab

In[1]: ...

Je pense que la plupart des gens utilisent cette solution pour tracer des graphes avec Python. Il s’agit d’une ligne de commande similaire à celle de R / Matlab, complétition, etc ... et elle exécute un thread séparé pour chaque tracé. ne devrait pas avoir le problème que vous avez décrit.

avez-vous essayé:

plt.close()

pour vous assurer que vous avez bien fermé l'objet de la parcelle?

Comme indiqué quelque part ci-dessus:

Utilisez plt.draw () pour tous vos graphiques, sauf le dernier.

Pour votre dernier tracé, utilisez plt.show ()

C'est bizarre, mais si vous n'utilisez pas plt.show () dans le dernier, et essayez plt.draw () , vous ne verrez pas toutes les parcelles.

Bonne chance avec ça!

J'ai eu ce problème lorsque TkAgg a été utilisé comme backend. Après avoir utilisé plt.close ('all') , mon ordinateur s'est figé.

La solution consistait à passer à un autre serveur. J'utilise maintenant Qt4Agg à la place.

Si vous avez Qt4Agg installé , il est possible de changer de moteur en tapant:

plt.switch_backend('Qt4Agg')

avant de tracer des données

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top