2009-08-02 2 views
9

seltsames Verhalten, ich bin sicher, dass es mir zu vermasseln, aber ich möchte auf den Boden bekommen, was passiert:Python Matplotlib hängt, wenn ein zweites Diagramm zum Plotten gefragt (nach dem ersten Chart-Fenstern zu schließen)

ich verwende den folgenden Code ein sehr einfaches Grafikfenster mit matplotlib zu erstellen:

>>> 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() 

und wie erwartete ich das Diagramm erhalten würde man, in einem neuen Fenster erwartet, dass immer wieder auftauchte, eine sehr einfache blaue Linie enthalten, gehen von 1 bis 3 wieder auf 1 auf der y-Achse, mit 0, 1, 2 als x-Achse (wie im Beispiel). Jetzt schließe ich das Grafikfenster (mit der Kreuztaste oben rechts unter Windows). Das gibt mir die Steuerung an den Dolmetscher, und ich beginne wieder, die Schaffung neuer Objekte:

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

Diesmal aber ich bekomme einen Fensterrahmen, mit nichts drin (nur der Rahmen, kein weißer Hintergrund nichts), und der ganze Knall Shooting hängt. Ich muss "Task beenden", der Python-Interpreter wird vom System beendet und ich bekomme eine Eingabeaufforderung zurück. Ähnliches Verhalten auf einem Mac (außer dass es den Graphen zuerst grafisch darstellt, bevor er auch hängt).

Also irgendwie Python und/oder Matplotlib will nicht, dass ich das Fenster manuell schließe. Weiß jemand, was hier vor sich geht und was ich tun soll? Ich würde gerne mit verschiedenen Plots im Inneren des Interpreten spielen, und offensichtlich hilft dieses Verhalten nicht. Ich weiß, ich könnte "Ipython -pylab" verwenden, aber im Interesse des Lernens möchte ich den obigen Fehler verstehen.

Danke.

Antwort

2

Scheinbar wird dies durch einen Fehler im Backend von tkinter verursacht. Siehe z.B. https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834. Es wird an ... gearbeitet Wenn Sie sich zu einer etwas älteren tkinter-Bibliothek regressieren können, sollte das ein Workaround für die Zeit sein (ich bin vor ein paar Wochen auf dasselbe gestoßen, und das war meine einzige Hoffnung).

0

haben Sie versucht:

plt.close() 

um sicherzustellen, dass Sie das Grundstück Objekt geschlossen?

+0

Plotten Ich habe jetzt Casey, aber keine Änderung. Wenn ich plt.show() aufrufen, wird das Diagrammfenster vom Python-Interpreter außer Betrieb gesetzt, dh ich habe keine Eingabeaufforderung. Erst wenn ich das Fenster schließe, bekomme ich die Eingabeaufforderung zurück. Wenn ich dann plt.close() aufrufen und dann weitermachen, verhält es sich genauso, dh hangt. Man bekommt das Gefühl (auf der Matplotlib-Website), dass man im Grunde im iPhython-Modus bleiben soll. –

+0

versuche scipy herunterzuladen, wenn du es noch nicht hast und importiere pylab. es funktioniert genau wie Matplotlib. – Nope

+0

Nein - auch nichts. Wenn pylab importieren und alle oben genannten tun, verhält sich genau so. –

2

Haben Sie versucht, ipython anstelle des Standard-Python-Interpreters zu verwenden?

Sie können mit dem folgenden Befehl installieren ipython:

easy_install ipython 

und dann hat ipython einen bestimmten Modus mit pylab lief werden, genannt -pylab:

ipython -pylab 

In[1]: ... 

Ich denke, dass die meisten Die Leute benutzen diese Lösung, um Graphen mit Python zu plotten, es ist eine Befehlszeile ähnlich der von R/Matlab, completition, etc ... und es läuft ein separater Thread für jedes Diagramm, so dass es nicht das Problem haben sollte beschrieben.

+0

Danke - ja ich kenne die Ipython Route (siehe oben). In der Tat sieht es so aus, als ob es ein wenig unberechenbar wäre. Ich denke, du hast Recht. Basicall Ipython ist der Weg nach vorne. –

8

Drei Monate zu spät zur Party, aber ich fand einen Vorschlag in der Matlibplot-Dokumentation, draw() anstelle von show() zu verwenden; ersteres macht anscheinend nur eine Wiedergabe des aktuellen Plots, während letzteres alle interaktiven Werkzeuge startet, wo die Probleme zu beginnen scheinen.

Es ist nicht sehr prominent in der Dokumentation gelegt, aber hier ist der Link: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

Für das, was es wert ist, ich habe versucht, pylab.show() und hatte genau das gleiche Problem, das Sie haben, während pylab. draw() scheint gut zu funktionieren, wenn ich nur die Ausgabe sehen möchte.

+0

Dank Rich - nützlich. Drei Monate sind nicht zu spät, da ich erst nach einer kurzen Pause wieder in Matplotlib eintrete. –

+0

Danke für den Link. Ich war immer verwirrt über show() und draw() und schließlich finde ich einige gute Informationen darüber. – Viktiglemma

+0

Es ist 2014 mit Matplotlib 1.4 out und diese Antwort ist immer noch relevant. – SkyNT

0

Wie irgendwo oben gepostet:

Verwenden plt.draw() für alle Grundstücke mit Ausnahme des letzten.

Für Ihre letzte Handlung, verwenden plt.show()

Es ist komisch, aber wenn Sie nicht plt.show() im letzten verwenden Sie und versuchen plt.draw() stattdessen Sie sehen keine Plots.

Viel Glück damit!

0

Ich hatte dieses Problem bei der Verwendung von TkAgg als Backend. Nach der Verwendung von plt.close('all') mein Computer eingefroren.

Die Lösung war, zu einem anderen Backend zu wechseln. Ich benutze jetzt stattdessen Qt4Agg.

Wenn Sie Qt4Agg installed haben, ist es möglich, Backends durch Eingabe wechseln:

plt.switch_backend('Qt4Agg') 

bevor Daten

Verwandte Themen