Ich versuche zu beheben, wie Python meine Daten darstellt. Sagen:
x = [0,5,9,10,15]
y = [0,1,2,3,4]
matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()
Die Ticks der x-Achse werden in Intervallen von 5 dargestellt. Gibt es eine Möglichkeit, Intervalle von 1 anzuzeigen?
Eng verwandte Frage: stackoverflow.com/questions/6682784/… und eine großartige Lösung: pyplot.locator_params(nbins=4)
– Dr. Jan-Philip Gehrcke
8. April 2014 um 11:49 Uhr
unutbu
Sie können explizit festlegen, wo Sie Markierungen mit markieren möchten plt.xticks:
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
Zum Beispiel,
import numpy as np
import matplotlib.pyplot as plt
x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()
(np.arange wurde anstelle von Python verwendet range Funktion für alle Fälle min(x) und max(x) sind Floats statt Ints.)
Das plt.plot (oder ax.plot)-Funktion wird automatisch die Standardeinstellung festlegen x und y Grenzen. Wenn Sie diese Grenzen beibehalten und einfach die Schrittweite der Häkchen ändern möchten, können Sie verwenden ax.get_xlim() um herauszufinden, welche Grenzen Matplotlib bereits gesetzt hat.
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))
Der Standard-Tick-Formatierer sollte gute Arbeit leisten, indem er die Tick-Werte auf eine vernünftige Anzahl signifikanter Stellen rundet. Wenn Sie jedoch mehr Kontrolle über das Format haben möchten, können Sie Ihren eigenen Formatierer definieren. Zum Beispiel,
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()
Gibt es keine Möglichkeit, es dazu zu bringen, immer noch seine eigenen Grenzen zu bestimmen, sondern einfach die Schrittgröße zu ändern? Diese Methode ist nicht sehr gut, wenn das Minimum etwa 3523,232512 ist!
– Korvus
1. Oktober 2013 um 16:41 Uhr
@Corone, es ist schon eine Weile her, seit Sie gefragt haben, aber ich habe unten eine Antwort gepostet, die eine einfache Steuerung der Schrittgröße ermöglicht, während weiterhin die automatische Bestimmung der Grenzen verwendet wird.
– Jthomas
26. März 2016 um 13:04 Uhr
Notiere dass der +1 in plt.xticks(np.arange(min(x), max(x)+1, 1.0)) ist erforderlich, um das letzte Häkchen anzuzeigen.
– Alex Willison
19. Mai 2017 um 15:23 Uhr
Ja, np.arange(start, stop) generiert Werte in der halb offen Intervall [start, stop), including start but excluding stop. So I used max(x)+1 to ensure that max(x) is included.
– unutbu
May 19, 2017 at 16:19
is there an equivalent for datetime e.g. plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1) ? it seems to only plots the year
– William Baker Morrison
Jan 10, 2018 at 11:42
robochat
Another approach is to set the axis locator:
import matplotlib.ticker as plticker
loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
There are several different types of locator depending upon your needs.
Here is a full example:
import matplotlib.pyplot as plt
import matplotlib.ticker as plticker
x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots() ax.plot(x,y) loc = plticker.MultipleLocator(base=1.0) # Dieser Locator setzt Ticks in regelmäßigen Abständen ax.xaxis.set_major_locator(loc) plt.show()
Dies funktioniert nicht wie erwartet. Insbesondere wenn Datumsangaben verwendet werden, verwendet es nicht die entsprechenden Datumsangaben.
– Chris Fonnesbeck
5. Februar 2014 um 17:02 Uhr
Wenn Sie Datumsangaben verwenden, sollten Sie die Methoden im Modul matplotlib.dates verwenden. Zum Beispiel matplotlib.dates.AutoDateLocator()
– Roboterchat
20. März 2014 um 13:06 Uhr
Es funktionierte wie erwartet für mich, mit Daten. Diese Lösung ist viel einfacher als die akzeptierte.
– Pablo Suau
8. Juli 2016 um 13:58 Uhr
Was macht base=1.0 eigentlich bedeuten/machen?
– WestCoastProjects
23. April 2020 um 6:18 Uhr
base=1.0 bedeutet, dass es für jede ganze Zahl einen Locator gibt. Die Dokumentation besagt, dass MultipleLocator “Set[s] ein Häkchen für jedes ganzzahlige Vielfache einer Basis innerhalb des Anzeigeintervalls.
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
x = [0,5,9,10,15]
y = [0,1,2,3,4]
tick_spacing = 1
fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()
Diese Lösung gibt Ihnen die explizite Kontrolle über den Tick-Abstand über die angegebene Zahl ticker.MultipleLocater()ermöglicht eine automatische Limitbestimmung und ist später gut ablesbar.
Eine Möglichkeit, dies zu tun, ohne die Ticks explizit zu berechnen!
– Zelphir Kaltstahl
31. August 2016 um 9:48 Uhr
Dies ist die gleiche Antwort wie diese. Es macht keinen Sinn, zwei Jahre später eine identische Antwort hinzuzufügen.
– ImportanceOfBeingErnest
23. Juni 2017 um 10:41 Uhr
Guter Fang. Ich habe sie nicht als gleich erkannt, als ich die Antwort gepostet habe. Trotzdem denke ich, dass diese Präsentation etwas verständlicher ist.
– Jthomas
23. Juni 2017 um 15:17 Uhr
Die Buchreferenz in dieser Antwort bietet auch eine hilfreiche Quelle für weitere Informationen.
– Steven C. Howell
16. April 2018 um 19:50 Uhr
Dies ist die gleiche Antwort wie die von robochat, die drei Jahre zuvor kam.
– MERose
8. September 2019 um 14:38 Uhr
Falls jemand an einem allgemeinen Einzeiler interessiert ist, holen Sie sich einfach die aktuellen Ticks und verwenden Sie sie, um die neuen Ticks zu setzen, indem Sie jeden zweiten Tick abtasten.
ax.set_xticks(ax.get_xticks()[::2])
Choldgraf
Dies ist ein bisschen hacky, aber bei weitem das sauberste / am einfachsten zu verstehende Beispiel, das ich gefunden habe, um dies zu tun. Es ist aus einer Antwort auf SO hier:
Der sauberste Weg, jedes n-te Tick-Label in der Matplotlib-Farbleiste auszublenden?
for label in ax.get_xticklabels()[::2]:
label.set_visible(False)
Dann können Sie die Etiketten durchlaufen, um sie je nach gewünschter Dichte sichtbar oder nicht sichtbar zu machen.
Bearbeiten: Beachten Sie, dass Matplotlib manchmal Labels == setzt '', so dass es so aussehen könnte, als ob ein Etikett nicht vorhanden ist, obwohl es tatsächlich vorhanden ist und einfach nichts anzeigt. Um sicherzustellen, dass Sie tatsächlich sichtbare Labels durchlaufen, können Sie Folgendes versuchen:
visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)
Dies ist die einfachste und generischste Lösung. Eine winzige Anpassung: normalerweise ax.get_xticklabels()[1::2] sind die auszublendenden Labels.
– jolvi
22. September 2015 um 12:02 Uhr
Dies funktioniert nicht mit matplotlib.finance.candlestick2
– BCR
12. Februar 2016 um 16:12 Uhr
@BCR es könnte sein, dass einige der xticklabels nur auf gesetzt sind '' Wenn Sie sie also durchlaufen, machen Sie xticklabels, die leer sind, unsichtbar (was keine Auswirkung auf die Visualisierung hätte, aber bedeuten könnte, dass Sie nicht die richtigen Labels ziehen). Du könntest es versuchen: vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
– Choldgraf
15. Februar 2016 um 19:57 Uhr
Gary Steele
Wenn Sie nur den Abstand festlegen möchten, verwenden Sie einen einfachen Einzeiler mit minimalem Textbaustein:
ein bisschen wie ein Schluck, aber ziemlich kompakt
Dies ist die einfachste und generischste Lösung. Eine winzige Anpassung: normalerweise ax.get_xticklabels()[1::2] sind die auszublendenden Labels.
– jolvi
22. September 2015 um 12:02 Uhr
Dies funktioniert nicht mit matplotlib.finance.candlestick2
– BCR
12. Februar 2016 um 16:12 Uhr
@BCR es könnte sein, dass einige der xticklabels nur auf gesetzt sind '' Wenn Sie sie also durchlaufen, machen Sie xticklabels, die leer sind, unsichtbar (was keine Auswirkung auf die Visualisierung hätte, aber bedeuten könnte, dass Sie nicht die richtigen Labels ziehen). Du könntest es versuchen: vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
– Choldgraf
15. Februar 2016 um 19:57 Uhr
Das ist ein altes Thema, aber ich stolpere hin und wieder darüber und habe diese Funktion gemacht. Es ist sehr bequem:
import matplotlib.pyplot as pp
import numpy as np
def resadjust(ax, xres=None, yres=None):
"""
Send in an axis and I fix the resolution as desired.
"""
if xres:
start, stop = ax.get_xlim()
ticks = np.arange(start, stop + xres, xres)
ax.set_xticks(ticks)
if yres:
start, stop = ax.get_ylim()
ticks = np.arange(start, stop + yres, yres)
ax.set_yticks(ticks)
Eine Einschränkung bei der Steuerung der Ticks auf diese Weise besteht darin, dass man die interaktive automatische Aktualisierung der maximalen Skalierung nach einer hinzugefügten Zeile nicht mehr genießt. Dann mach
gca().set_ylim(top=new_top) # for example
und führen Sie die Nachjustierungsfunktion erneut aus.
14000000cookie-checkÄndern der Tickfrequenz auf der x- oder y-Achseyes
Eng verwandte Frage: stackoverflow.com/questions/6682784/… und eine großartige Lösung:
pyplot.locator_params(nbins=4)
– Dr. Jan-Philip Gehrcke
8. April 2014 um 11:49 Uhr