9
votes

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

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

J'exécute le code suivant pour créer une fenêtre de graphique très simple à l'aide de Matplotlib: p> xxx pré>

et comme prévu, je reçois la carte que l'on s'attendrait, dans une nouvelle fenêtre qui a accumulé, contenant une ligne bleue très simple passant de 1 à 3 retour à 1 à nouveau sur y Axe, avec 0, 1, 2 comme points d'axe X (tout comme exemple). Maintenant, je ferme la fenêtre graphique (à l'aide du bouton croisé dans la partie supérieure droite sous Windows). Cela me donne le contrôle à l'interprète et je recommence, créant de nouveaux objets: P>

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


0 commentaires

6 Réponses :


0
votes

Avez-vous essayé: xxx

pour vous assurer de fermer l'objet de la parcelle?


3 commentaires

J'ai maintenant Casey, mais pas de changement. Lorsque j'appelle plt.show (), il affiche la fenêtre du graphique par l'interprète Python sort de l'utilisation, c'est-à-dire que je n'ai pas une invite. Seulement quand je ferme la fenêtre, puis-je récupérer le message. Si j'appelle ensuite Plt.close () puis continuez, il se comporte exactement de la même manière, c'est-à-dire pend. Obtenir le sentiment (creuser autour du site Web de Matplotlib) qu'ils veulent essentiellement que vous vous tiens à ipython en mode -Pylab.


Essayez Télécharger Scipy, si vous ne l'avez pas déjà et importer un pylab. Cela fonctionne comme Matplotlib.


Nope - rien non plus. Si Import Pylab, et faites tout ce qui précède, se comporte exactement de la même manière.



2
votes

Avez-vous essayé d'utiliser ipython au lieu de l'interpréteur python standard?

Vous pouvez installer ipython avec la commande suivante: xxx

et ensuite, Ipython a une spécificité mode à courir avec pylab, appelé -pylab: xxx

Je pense que la plupart des gens utilisent cette solution pour tracer des graphiques avec python, c'est une ligne de commande similaire à la L'un des r / matlab, la finition, etc ... et il exécute un fil séparé pour chaque parcelle de sorte qu'il ne devrait pas avoir le problème que vous avez décrit.


1 commentaires

Merci - Oui, je connais la route Ipython (voir les commentaires ci-dessus). En effet, cela ressemble à ceci est la voie à suivre, même si cela peut aussi être un peu imprévisible. Je pense que tu as raison cependant. Basicall Ipython est la voie à suivre.



2
votes

Apparemment, cela est causé par un bogue dans le backend Tkinter. Voir, par exemple, https://bugs.Launchpad.net/ubuntu/ + Source / Matplotlib / + Bug / 313834 . Il est travaillé sur ... Si vous pouvez régresser à une bibliothèque de tkinter légèrement plus ancienne, cela devrait être une solution de contournement pour le moment étant (j'ai rencontré cette même chose il y a quelques semaines, et c'était mon seul espoir).


0 commentaires

8
votes

trois mois de retard à la fête, mais j'ai trouvé une suggestion dans la documentation Matlibplot à utiliser Draw () plutôt que de montrer (); Le premier apparemment fait un rendu de la parcelle actuelle, tandis que ces derniers démarrent tous les outils interactifs, ce qui est là où les problèmes semblent commencer.

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

Pour ce que ça vaut la peine, j'ai essayé pylab.show () et avait exactement le même problème que vous avez fait, tandis que Pylab.Draw () semble fonctionner correctement si je veux juste voir la sortie.


3 commentaires

Merci riche - utile. Trois mois n'est pas trop tard car je ne suis que maintenant de retourner à Matplotlib après un peu d'hiatus, en fait.


Merci pour le lien. J'ai toujours été confus à propos de Show () et de dessiner () et enfin, je trouve une bonne information à ce sujet.


C'est 2014 avec Matplotlib 1.4 out et cette réponse est toujours pertinente.



0
votes

Comme indiqué quelque part ci-dessus:

Utiliser plt.draw () pour toutes vos parcelles, à l'exception de la dernière.

Pour votre dernière parcelle, utilisez plt.show ()

C'est bizarre, mais si vous n'utilisez pas plt.show () dans le dernier et essayez plt.draw () à la place, vous ne voyez pas des parcelles.

bonne chance avec ça!


0 commentaires

0
votes

J'ai eu ce problème lors de l'utilisation de Tkagg comme backend. Après avoir utilisé plt.close ('tout') mon ordinateur gelé.

La solution consistait à passer à un autre backend. J'utilise maintenant qt4agg à la place.

si vous avez qt4agg installé c'est possible Pour commuter les backends en tapant: xxx

avant de tracer des données


0 commentaires