Problem mit Matplotlib Einheiten der y- Achse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Hallo,

ich habe ein Problem mit den Einheiten der Matplotlib Achsen. Ich erzeuge automatische Plots von verschiedenen Daten. Bei großen oder sehr kleinen Zahlen wechselt Matplotlib automatisch auf eine wissenschaftliche Darstellung mit den Einheiten, so steht an der y-Achse oben plötzlich zum Beispiel x1e-5+1.009.

Ich suche vergeblich eine Möglichkeit die Einheiten fest zu halten.

Bsp: y-Achse soll immer in 0.1 Schritten angezeigt werden, auch wenn die Werte zwischen 0.801 und 0.806 liegen soll kein "Zoom" auf eine kleinere Skala geschehen.

Danke
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi

etwas Beispielcode:

Code: Alles auswählen

from pylab import *
plot([1,2,3],[0.8,0.95, 0.86])
ylim(ymin=0, ymax=1)
xticks(arange(1,3.2, 0.2))
show()
Selbsterklärend, oder? Das mit den Ticks ist ggf. etwas tricky, aber meist doch einfach zu lösen. Wenn nicht, poste einfach etwas Beispielcode, wir können sicher helfen.

Ein Link, der Dich in dem Zusammenhang interessieren könnte (habe ich vor einiger Zeit mal geschrieben): http://www.scipy.org/Cookbook/Matplotli ... ked_arrays
Falls was unklar ist, hier posten, dann erweitere ich das Cookbook.

Gruß,
Christian
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ach, und wegen der Formatierung: Du mußt den Achsen-Instanzen die Formatierung vorgeben:

Code: Alles auswählen

x = subplot(111)
Axes.ticklabel_format(x,style='plain')
x.plot([1e9,1.5e9],[1,2])
show()
In meinen Beispielen bin ich immer von pylab ausgegangen, aber wenn auch der Namespace für matplotlib etwas unterschiedlich ist, solltest Du das doch finden können. Am einfachsten ist es aber vielleicht das rc-File anzupassen, bzw. im Code des Skriptes solche Geschichten

Code: Alles auswählen

from matplotlib import rcParams
rcParams['text.fontname'] = 'cmr10'
rcParams['lines.markerfacecolor'] = None
from matplotlib import rc
rc('text', usetex=True)
rc('axes', hold=True)
zu machen. Das ist wahrscheinlich am einfachsten, wenn alle Plots aus einem Skript die gleichen Einstellungen haben sollen, ohne, daß Du die defaults ändern willst.

Gruß,
Christian
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Danke,

das passt so perfekt, ohne das erste kleine Beispiel von dir wäre ich nie drauf gekommen. :? Ich hatte nicht verstanden das ich ylim und yticks zusammen verwenden muss. Wie doof von mir.

Schade das Matplotlib das nicht von alleine so gut anpasst. Aber das kann man ja schnell passend programmieren.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Lufia hat geschrieben:Schade das Matplotlib das nicht von alleine so gut anpasst.
Diskussionen hierzu gab es auf der Mailingliste schon manchmal. Aber es gibt einen Widerspruch zwischen Flexibilität eines Plottingpaketes und Bequemlichkeit der Nutzer: Was für den Einen eine gute Einstellung ist, ist für den Anderen totaler Blödsinn. So etwas fällt um so stärker auf, je komplexer und mächtiger das Paket. Tja, ...
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Was für den Einen eine gute Einstellung ist, ist für den Anderen totaler Blödsinn. So etwas fällt um so stärker auf, je komplexer und mächtiger das Paket. Tja, ...
Ja, das stimmt leider. Ich habe jetzt noch etwas herumprobiert und bin zum Fazit gekommen, dass matplotlib das eigentlich echt nicht schlecht macht.

Zumindest werden Unterschiede in den Daten klar aufgezeigt. Das Problem ist eigentlich nur das man bei Präsentationen, oder so schlecht mit einer Skala kommen kann die nicht innerhalb von 3 Sekunden verständlich ist. Z.B. die automatischen Einheiten der y-Achse sind verwirrend.

Code: Alles auswählen

from pylab import *
plot([1,2,3],[0.300142,0.300121, 0.30012])
show()
Wenigstens kann man das so gestalten das die Skala etwas schneller verständlich wird.

Code: Alles auswählen

from pylab import *
plot([1,2,3],[0.300142,0.300121, 0.30012])
ylim(ymin=0.3001, ymax=0.3002)
yticks(arange(0.3001,0.3002, 0.00001))
show()
Aber immer noch problematisch das schnell aufzunehmen. Es ist eben kompliziert sich an die wissenschaftliche Darstellung zu "gewöhnen".

Evtl. ist es schöner die Skalen davor schon passend zu skalieren. Die Kunst beim plotten für Präsentationen bleibt also die Daten so aufzubereiten das sie schnell zugänglich sind. Und zu analysieren muss man die Unterschiede sofort sehen können was matplotlib ja von sich aus richtig gut macht.
Antworten