Ich habe eine Matplotlib-Figur, in der ich Daten zeichne, die immer als Nanosekunden bezeichnet werden (1e-9). Wenn ich auf der y-Achse Daten habe, die zehn Nanosekunden betragen, d. H. In 44e-9 wird der Wert auf der Achse als 4,4 mit einem + 1e-8 als Versatz angezeigt. Gibt es überhaupt eine Möglichkeit, die Achse zu zwingen, 44 mit einem Versatz von + 1e-9 anzuzeigen?
Gleiches gilt für meine x-Achse, auf der die Achse + 5.54478e4 anzeigt, wo ich lieber einen Versatz von +55447 anzeigen möchte (ganze Zahl, keine Dezimalstelle - der Wert hier ist in Tagen).
Ich habe ein paar Dinge wie diese ausprobiert:
p = axes.plot(x,y)
p.ticklabel_format(style='plain')
für die x-Achse, aber das funktioniert nicht, obwohl ich es wahrscheinlich falsch benutze oder etwas aus den Dokumenten falsch interpretiere, kann mich jemand in die richtige Richtung weisen?
Danke, Jonathan
Ich habe versucht, etwas mit Formatierern zu tun, habe aber noch keine Lösung gefunden ...:
myyfmt = ScalarFormatter(useOffset=True)
myyfmt._set_offset(1e9)
axes.get_yaxis().set_major_formatter(myyfmt)
und
myxfmt = ScalarFormatter(useOffset=True)
myxfmt.set_portlimits((-9,5))
axes.get_xaxis().set_major_formatter(myxfmt)
Nebenbei bemerkt, ich bin tatsächlich verwirrt darüber, wo sich das Objekt "Versatznummer" tatsächlich befindet ... ist es Teil der Haupt- / Neben-Ticks?
quelle
set_units
? matplotlib.sourceforge.net/api/… (Ich kann es nicht versuchen, weil ich hier kein Matplotlib habe.)rcParams
, ob standardmäßig deaktiviert werden soll :rcParams["axes.formatter.useoffset"] = False
wie hier: stackoverflow.com/questions/24171064/…Antworten:
Ich hatte genau das gleiche Problem und diese Zeilen haben das Problem behoben:
quelle
ax.get_yaxis().get_major_formatter().set_useOffset(False)
from matplotlib.ticker import ScalarFormatter
Code von @Gonzalo funktioniert, oder verwenden Sie einfach die oben genannte Lösung vonEine viel einfachere Lösung besteht darin, die Häkchenbezeichnungen einfach anzupassen. Nehmen Sie dieses Beispiel:
Beachten Sie, wie ich im Fall der y-Achse die Werte multipliziert habe, indem ich
1e9
diese Konstante im y-Label erwähnt habeBEARBEITEN
Eine andere Möglichkeit besteht darin, den Exponentenmultiplikator zu fälschen, indem Sie seinen Text manuell oben im Plot hinzufügen:
EDIT2
Sie können den Versatzwert der x-Achse auch auf folgende Weise formatieren:
quelle
Sie müssen eine Unterklasse erstellen
ScalarFormatter
, um das zu tun, was Sie benötigen. Fügen Sie_set_offset
einfach eine Konstante hinzu, die Sie festlegen möchtenScalarFormatter.orderOfMagnitude
. Leider führt die manuelle Einstellung zuorderOfMagnitude
nichts, da sie zurückgesetzt wird, wenn dieScalarFormatter
Instanz aufgerufen wird, um die Achsen-Tick-Beschriftungen zu formatieren. Es sollte nicht so kompliziert sein, aber ich kann keinen einfacheren Weg finden, genau das zu tun, was Sie wollen ... Hier ein Beispiel:Was so etwas ergibt wie:
Die Standardformatierung würde folgendermaßen aussehen:
Hoffe das hilft ein bisschen!
Bearbeiten: Für das, was es wert ist, weiß ich auch nicht, wo sich das Offset-Label befindet ... Es wäre etwas einfacher, es einfach manuell einzustellen, aber ich konnte nicht herausfinden, wie das geht ... Ich habe das Gefühl dass es einen einfacheren Weg geben muss als all dies. Es funktioniert aber!
quelle
Ähnlich wie bei Amro können Sie FuncFormatter verwenden
quelle
Gonzalos Lösung begann für mich zu funktionieren, nachdem sie hinzugefügt hatte
set_scientific(False)
:quelle
Wie in den Kommentaren und in dieser Antwort ausgeführt wurde , kann der Offset global wie folgt ausgeschaltet werden:
quelle
Ich denke, dass eine elegantere Art die Verwendung des Ticker-Formatierers ist. Hier ist ein Beispiel für xaxis und yaxis:
quelle
Für den zweiten Teil war dies meine Lösung, ohne alle Ticks manuell zurückzusetzen:
Natürlich können Sie die Formatzeichenfolge beliebig einstellen.
quelle