So verhindern Sie, dass Zahlen in Python matplotlib in Exponentialform geändert werden

74

Ich verwende Matplotlib in Python, um einfache xy-Datensätze zu zeichnen. Dies führt zu gut aussehenden Diagrammen. Wenn ich jedoch verschiedene Bereiche des gezeichneten Diagramms mithilfe der Abbildungansicht (die bei der Ausführung angezeigt wird plt.show()) zu nahe heran zoome, ändern sich die Werte der x-Achse gegenüber der Standardnummernform (1050, 1060, 1070 usw.) in wissenschaftlicher Form mit Exponentialschreibweise (zB 1, 1,5, 2,0 mit der Bezeichnung x-Achse angegeben als +1.057e3).

Ich würde es vorziehen, wenn meine Figuren die einfache Nummerierung der Achse beibehalten, anstatt die Exponentialform zu verwenden. Gibt es eine Möglichkeit, Matplotlib dazu zu zwingen?

IanRoberts
quelle
1
Duplikat von stackoverflow.com/questions/11855363/…
Tacaswell

Antworten:

95

Die Formatierung von Häkchen wird von einem FormatterObjekt gesteuert. Vorausgesetzt, Sie haben nichts Besonderes getan, ist dies ScalerFormatterstandardmäßig ein . Dieser Formatierer verwendet eine konstante Verschiebung, wenn die gebrochene Änderung der sichtbaren Werte sehr gering ist. Um dies zu vermeiden, schalten Sie es einfach aus:

plt.plot(arange(0,100,10) + 1000, arange(0,100,10))
ax = plt.gca()
ax.get_xaxis().get_major_formatter().set_useOffset(False)
plt.draw()

Wenn Sie die wissenschaftliche Notation im Allgemeinen vermeiden möchten,

ax.get_xaxis().get_major_formatter().set_scientific(False)

Kann dies global über den axes.formatter.useoffsetrcparam steuern.

Tacaswell
quelle
1
Danke, das funktioniert. Entschuldigung auch für die doppelte Frage - Ich habe vor dem Posten gesucht, aber meine Suche enthielt Begriffe wie "wissenschaftliche Notation" und "Exponentialform" anstelle von "relativen Achsenverschiebungen", wie sie der vorherige Benutzer verwendet hat.
IanRoberts
2
Gibt es eine Möglichkeit, diese Änderung dauerhaft zu erzwingen? Ich habe die wissenschaftlichen Notationsachsen nie gefunden und sie am Ende immer ausgeschaltet. Ich konnte dafür allerdings kein rcParam sehen.
IanRoberts
1
@ IanRoberts Siehe Update, es ist der axes.formatter.useoffsetrcparam
tacaswell
3
Vielen Dank! Ich persönlich würde es vorziehen, diese Einstellung standardmäßig auf "Falsch" zu setzen, da sie viele zu verwirren scheint und nur wenigen zugute kommt.
IanRoberts
Richtig, guter Punkt. Das war eine ziemlich unbegründete Behauptung, obwohl ich einige Leute gesehen habe, die gefragt haben, wie man dies deaktiviert. Wie auch immer, dieses Update löst es gut, so dass ich es
vorerst
24

Sie können einen einfacheren Befehl verwenden, um ihn auszuschalten:

plt.ticklabel_format(useOffset=False)
Eki
quelle
17

Sie können etwas verwenden wie:

from matplotlib.ticker import ScalarFormatter, FormatStrFormatter

ax.xaxis.set_major_formatter(FormatStrFormatter('%.0f'))
Animesh Saxena
quelle
Dies ist die einzige Lösung, die bei Verwendung einer Protokollachse für mich funktioniert hat. Andere Optionen Ich habe alle AttributeError: 'LogFormatterSciNotation' object has no attribute 'set_scientific'
ausgelösten
1

Verwenden Sie den folgenden Befehl: ax.ticklabel_format(useOffset=False, style='plain')

Wenn Sie eine Nebenhandlung verwenden, tritt möglicherweise Folgendes auf: AttributeError: This method only works with the ScalarFormatterIn diesem Fall würden Sie axis='y'Folgendes hinzufügen . Sie können 'y' in die Achse mit den Problemen ändern.

ax1.ticklabel_format(useOffset=False, style='plain', axis='y')

Quelle Frage und Antwort hier . Beachten Sie, dass die axis 'y'Verwendung des Befehls in den Antwortkommentaren ausgeblendet ist.

Mauro
quelle