2016-06-23 19 views
1

Ich stoße auf ein seltsames Problem mit Matplotlib. Hier ist mein Code:pylab: unterschiedliches Verhalten in Shell und Skript

f,a=subplots(3,1,sharex='col') 
f.set_figheight(3.) 
f.set_figwidth(3.) 
## Make plots, set labels for a[0], a[1], a[2] 
a[2].set_xlim(-4.40,6) 

[plt.setp(i.get_xticklabels(),fontsize=9) for i in a] 
[plt.setp(i.get_yticklabels(),fontsize=9) for i in a] 
[i.set_yscale('log') for i in a] 
[i.set_ylim(1e-4,1.) for i in a] 

for i in a: 
##The following part is problematic 
    labels=[j.get_text() for j in i.get_yticklabels()] 
## end problematic part 
    print labels 
    labels[1] = u''; i.set_yticklabels(labels) 

f.subplots_adjust(hspace=0) 
plt.show() 

Das Problem ist, dass ein Teil der für die Schleife, die yticklabels funktioniert gut bekommt, wenn ich es in der Shell ausgeführt, nachdem die Handlung zu machen, aber es gibt eine leere Liste, wenn ich es als Teil des Laufes über Skript.

Wenn ich den Code innerhalb ipython laufen mit:

#Code run inside IPython shell 
run -i 'myscript.py' 

bekomme ich folgende Ausgabe:

['', '', '', '', '', '', ''] 
['', '', '', '', '', '', ''] 
['', '', '', '', '', '', ''] 

Das ist nicht das, was ich will. Allerdings, wenn ich das Etikett Änderung im Skript Kommentar aus und führen Sie die folgenden Schritte aus:

# Code run inside IPython shell 
run -i 'myscript.py' 
for i in a: 
    labels=[j.get_text() for j in i.get_yticklabels()] 
    print labels 
    labels[1] = u''; i.set_yticklabels(labels) 

ich folgende Ausgabe:

['', '$\\mathdefault{10^{-4}}$', '$\\mathdefault{10^{-3}}$', '$\\mathdefault{10^{-2}}$', '$\\mathdefault{10^{-1}}$', '$\\mathdefault{10^{0}}$', ''] 
['', '$\\mathdefault{10^{-4}}$', '$\\mathdefault{10^{-3}}$', '$\\mathdefault{10^{-2}}$', '$\\mathdefault{10^{-1}}$', '$\\mathdefault{10^{0}}$', ''] 
['', '$\\mathdefault{10^{-4}}$', '$\\mathdefault{10^{-3}}$', '$\\mathdefault{10^{-2}}$', '$\\mathdefault{10^{-1}}$', '$\\mathdefault{10^{0}}$', ''] 

, die die Ausgabe ich erwarte. Ich habe keine Ahnung, was hier passieren könnte. Jede Hilfe wird sehr geschätzt. Gibt es auch eine "pythonische" Art, die for-Schleife zu schreiben? Eigentlich

Dank

+0

Könnten Sie erklären, was "run" ist, dass Sie verwenden? Soll das "ipython -i" sein? – NichtJens

+0

Ich führe das Skript interaktiv innerhalb der IPython-Shell auf diese Weise: ---- In [1]: run -i 'myscript.py' – toylas

+0

Ich sehe. Haben Sie versucht, es über den Standardinterpreter auszuführen? Ich denke, das wird das gleiche Ergebnis erzeugen, aber dann würdest du wissen, dass es nicht ipython war, komische Dinge zu tun ... – NichtJens

Antwort

3

, die for-Schleife ist mehr "pythonic" als Ihr Missbrauch der Liste Verständnisses. Siehe auch here.

Ich denke, Sie sollten alle diese in die for-Schleife verschieben ... Auf diese Weise haben Sie eine einzige äußere Schleife. In Ihrem Code machen Sie die gleiche Schleife fünf Mal.

Als Zen of Python sagt:

Ablesbarkeit zählt.


Für Ihre eigentliche Frage: Sie sind in this problem?

Ihre Version von Matplotlib ist zu neu (matplotlib.__version__ = 1.3.1 wie Sie Ihren Kommentar). Daher können Sie den Code in der accepted answer dort nicht verwenden, wie im ersten Absatz dieser Antwort.

Dort sollte eine Antwort, die für neuere Version von Matplotlib is given funktionieren sollte (aber nicht akzeptiert), auch. Der Haupttrick ist axes.get_xticks().tolist() anstelle von axes.get_xticklabels() ...

+0

Das ist genau das, was ich bekomme, wenn ich den Label-Editor innerhalb des Skripts starte. Der Achsenbereich reicht von 1e-4 bis 1. und ich möchte, dass die ylabels von 1e-3 zu 1 sind. Pylab fügt automatisch alle ein und ich möchte 1e-4 entfernen. Bitte sehen Sie meine Bearbeitung, um zu sehen, was erwartet wird. – toylas

+0

Welche Version von Matplotlib verwenden Sie? – NichtJens

+0

matplotlib .__ version__ = 1.3.1 und matplotlib .__ version__numpy = 1.5 – toylas

Verwandte Themen