Ich versuche zu korrigieren, wie Python meine Daten zeichnet.
Sagen
x = [0,5,9,10,15]
und
y = [0,1,2,3,4]
Dann würde ich tun:
matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()
und die Ticks der x-Achse werden in Intervallen von 5 aufgezeichnet. Gibt es eine Möglichkeit, Intervalle von 1 anzuzeigen?
python
matplotlib
Dax Feliz
quelle
quelle
pyplot.locator_params(nbins=4)
Antworten:
Sie können explizit festlegen, wo Sie Markierungen ankreuzen möchten
plt.xticks
:Zum Beispiel,
(
np.arange
wurde für allerange
Fälle anstelle von Pythons Funktion verwendetmin(x)
undmax(x)
ist Floats anstelle von Ints.)Die
plt.plot
(oderax.plot
) Funktion legt automatisch Standardeinstellungenx
undy
Grenzwerte fest. Wenn Sie diese Grenzwerte beibehalten und nur die Schrittweite der Häkchen ändern möchten, können Sie ermittelnax.get_xlim()
, welche Grenzwerte Matplotlib bereits festgelegt hat.Der Standard-Tick-Formatierer sollte gute Arbeit leisten und die Tick-Werte auf eine sinnvolle Anzahl signifikanter Stellen runden. Wenn Sie jedoch mehr Kontrolle über das Format haben möchten, können Sie Ihren eigenen Formatierer definieren. Zum Beispiel,
Hier ist ein lauffähiges Beispiel:
quelle
+1
Inplt.xticks(np.arange(min(x), max(x)+1, 1.0))
erforderlich ist, um das letzte Häkchen anzuzeigen.np.arange(start, stop)
generiert Werte im halboffenen Intervall[start, stop)
, einschließlich,start
aber ausschließlichstop
. Also habe ich immer dafürmax(x)+1
gesorgt, dassmax(x)
das enthalten ist.plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)
. es scheint nur das Jahr zuEin anderer Ansatz besteht darin, den Achsen-Locator einzustellen:
Abhängig von Ihren Anforderungen gibt es verschiedene Arten von Ortungsgeräten.
Hier ist ein vollständiges Beispiel:
quelle
matplotlib.dates.AutoDateLocator()
base=1.0
eigentlich?Ich mag diese Lösung (aus dem Matplotlib Plotting Cookbook ):
Diese Lösung gibt Ihnen eine explizite Kontrolle des Tick-Abstands über die angegebene Nummer
ticker.MultipleLocater()
, ermöglicht die automatische Grenzwertbestimmung und ist später leicht abzulesen.quelle
Wenn sich jemand für einen allgemeinen Einzeiler interessiert, holen Sie sich einfach die aktuellen Ticks und setzen Sie damit die neuen Ticks, indem Sie jeden zweiten Tick abtasten.
quelle
ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
Dies ist ein bisschen hackig, aber bei weitem das sauberste / am einfachsten zu verstehende Beispiel, das ich dafür gefunden habe. Es ist von einer Antwort auf SO hier:
Der sauberste Weg, jedes n-te Häkchen in der Matplotlib-Farbleiste zu verstecken?
Anschließend können Sie die Beschriftungen durchlaufen und sie je nach gewünschter Dichte als sichtbar oder nicht sichtbar festlegen.
Bearbeiten: Beachten Sie, dass matplotlib manchmal Beschriftungen == setzt
''
, sodass es möglicherweise so aussieht, als ob eine Beschriftung nicht vorhanden ist, obwohl sie tatsächlich nichts anzeigt. Um sicherzustellen, dass Sie die tatsächlich sichtbaren Beschriftungen durchlaufen, können Sie Folgendes versuchen:quelle
ax.get_xticklabels()[1::2]
die Etiketten ausgeblendet werden.''
dass Sie beim Durchlaufen leere Xticklabels unsichtbar machen (was keine Auswirkungen auf die Visualisierung hätte, aber möglicherweise bedeutet, dass Sie nicht ziehen die richtigen Etiketten). Sie könnten versuchen:vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
Dies ist ein altes Thema, aber ich stolpere hin und wieder darüber und habe diese Funktion gemacht. Es ist sehr praktisch:
Eine Einschränkung bei der Steuerung solcher Zecken besteht darin, dass man die interaktive automatische Aktualisierung der maximalen Skalierung nach einer hinzugefügten Zeile nicht mehr genießt. Dann mach
und führen Sie die Resadjust-Funktion erneut aus.
quelle
Ich habe eine unelegante Lösung entwickelt. Bedenken Sie, dass wir die X-Achse und auch eine Liste von Beschriftungen für jeden Punkt in X haben.
Beispiel: Angenommen, ich möchte Zeckenbezeichnungen nur für 'feb' und 'jun' anzeigen. Gut, jetzt haben wir eine gefälschte Liste von Etiketten. Zuerst haben wir die Originalversion gezeichnet. Nun die modifizierte Version.quelle
Wenn Sie nur den Abstand auf einen einfachen Einzeiler mit minimaler Boilerplate einstellen möchten:
funktioniert auch leicht bei kleinen Zecken:
ein bisschen mundvoll, aber ziemlich kompakt
quelle
Das hat bei mir funktioniert
Wenn Sie Ticks zwischen [1,5] (einschließlich 1 und 5) wünschen, ersetzen Sie diese
quelle
xmarks = range(1, length+1, 1)
. ziemlich sicher, dass das Listenverständnis überflüssig ist.Reine Python-Implementierung
Im Folgenden finden Sie eine reine Python-Implementierung der gewünschten Funktionalität, die alle numerischen Reihen (int oder float) mit positiven, negativen oder gemischten Werten verarbeitet und es dem Benutzer ermöglicht, die gewünschte Schrittgröße anzugeben:
Beispielausgabe
Beispielnutzung
Beachten Sie, dass die x-Achse ganzzahlige Werte hat, die alle gleichmäßig um 5 voneinander beabstandet sind, während die y-Achse ein anderes Intervall hat (das
matplotlib
Standardverhalten, da die Häkchen nicht angegeben wurden).quelle