Reduzierung der Anzahl der Plot-Ticks

160

Ich habe zu viele Häkchen in meinem Diagramm und sie laufen ineinander.

Wie kann ich die Anzahl der Zecken reduzieren?

Zum Beispiel habe ich Zecken:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

Und ich will nur:

1E-5, 1E-3, ... 1E5, 1E7

Ich habe versucht, mit dem zu spielen LogLocator, aber ich konnte das nicht herausfinden.

jlconlin
quelle

Antworten:

266

Wenn Sie alternativ einfach die Anzahl der Ticks festlegen möchten, während matplotlib sie positionieren kann (derzeit nur mit MaxNLocator), gibt es Folgendes pyplot.locator_params:

pyplot.locator_params(nbins=4)

Sie können in dieser Methode eine bestimmte Achse angeben, wie unten erwähnt. Die Standardeinstellung ist beides:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)
Bgamari
quelle
27
Dies war ein großartiger Vorschlag, da auch die Möglichkeit, den Prozess zu spezifizieren pyplot.locator_params(axis = 'x', nbins = 4)(oder axis = 'y'), sehr einfach war. Danke @bgamari!
Benjaminjross
8
Mit Log-Skala funktionierte dies numticksanstelle vonnbins
meduz
1
@bgamari, könnten Sie bitte die numticksLösung für logarithmische Diagramme hinzufügen, auf die @meduz hingewiesen hat?
Løiten
7
Dies scheint die Etiketten nicht dort zu platzieren, wo sie sein sollten. Wenn zum Beispiel die ursprünglichen Häkchenbeschriftungen sind [0, 1, ..., 99]und jetzt eine gesetzt wird nticks=10, werden die neuen spärlichen Beschriftungen entlang der Achse zehnmal so weit voneinander entfernt platziert, dh jetzt 1sitzen, wo 9war, 2wo 19war ... und 9wo 99war.
Vim
2
Überprüfen Sie Ihre Ergebnisse, bevor Sie dieser Methode vertrauen. @Vim ist richtig. Die Häkchenwerte werden falsch platziert.
David J.
53

Wenn jemand diese Seite noch in den Suchergebnissen erhält:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)
Katerina
quelle
7
Dies funktionierte tatsächlich im Vergleich zu allen anderen Antworten, die nichts taten. danke :)
faizan
Gut gemacht. Ich habe eine Weile gebraucht, um das zu finden, aber es hat getan, was ich wollte.
John
Vielen Dank, dies stellt sicher, dass die verbleibenden Etiketten an den richtigen Positionen sind. Ein zusätzlicher Schritt, der diese Antwort verbessern würde, besteht darin, auch das Häkchen zu entfernen.
David J.
Tolle einfache Antwort - überrascht, dass der SO-Community keine benutzerdefinierte Methode bekannt ist. Dies wäre eine wertvolle Ergänzung zu lib?
Jabberwocky
31

Informationen zum Anpassen des Problems der Anpassung und des Erscheinungsbilds der Ticks finden Sie im Tick ​​Locators- Handbuch auf der matplotlib-Website

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

Würde die Gesamtzahl der Ticks in der x-Achse auf 3 setzen und sie gleichmäßig über die Achse verteilen.

Es gibt auch ein schönes Tutorial dazu

Prageeth Jayathissa
quelle
Wählen Sie nur die ersten 3 Datums- / Uhrzeitindizes aus. wenn Axt von pandas.DataFrame.plot ax = df.plot()
Mithril
@Mithril Entschuldigung, ich verstehe Ihren Kommentar nicht ganz. Könnten Sie bitte näher darauf eingehen?
Prageeth Jayathissa
Wenn ich ein df ( pandas.DataFrame) mit datetime index [2019-01-01, ... 2019-11-01] habe, rufe auf ax = df.plot()und gib ein Zahlenobjekt zurück . call ax.xaxis.set_major_locator(plt.MaxNLocator(3)) only show first 3 index [2019-01-01, 2019-01-02, 2019-01-03].
Mithril
1
@Mithril, df.plot()zeigt oft das an minor_locator, also möchten Sie es vielleicht versuchen ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Denken Sie auch daran, 3die Anzahl der anzuzeigenden Ticks durch die zu ersetzen . Für Pandas Timeseries empfehle ich import matplotlib.dates as mdatesund laufe ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))mitax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa
20

Es gibt eine set_ticks()Funktion für Achsenobjekte.

André Caron
quelle
4
Dies würde funktionieren, wenn ich vorher wüsste, welche Zecken ich wollte. Das Beispiel, das ich oben gegeben habe, war nur ein Beispiel. Ich weiß nicht, was die Zecken sind, ich weiß nur, dass ich weniger davon will, dh jeden anderen.
Jlconlin
10
Sie können das Achsenobjekt aufrufen get_xticks()oder get_yticks()zuerst anfordern, nach Bedarf bearbeiten und dann die Liste an übergeben set_ticks().
user812786
4
Ich habe nicht set_ticks(), aber ich habe set_xticks()und set_yticks(). Dies sind Attribute von Achsenobjekten, nicht von Achsenobjekten. Vielleicht hat sich dies in den letzten Jahren geändert.
Gauthier
2
Ich bin mir nicht sicher, ob ich sollte, einige Leute haben Ihre Antwort so nützlich gefunden, wie sie ist, und nur weil sie für mich anders ist, heißt das nicht, dass sie für alle gilt.
Gauthier
1
Ein Beispiel würde viel dazu beitragen, diese Antwort nützlich zu machen.
Richard
10

Für den Fall, dass es noch jemand braucht und da hier nichts wirklich für mich funktioniert hat, habe ich eine sehr einfache Methode gefunden, mit der das Erscheinungsbild des generierten Plots "wie es ist" beibehalten wird, während die Anzahl der Ticks auf genau N festgelegt wird:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))
Raphael
quelle
2
Ich musste die letzte Zeile leicht ändern, damit sie die Werte als int anstelle von float ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
zurückgibt
@ NickSettje schwebt immer noch mit mir!
Mohd
4

Die von @raphael gegebene Lösung ist unkompliziert und sehr hilfreich.

Die angezeigten Tick-Beschriftungen sind jedoch keine Werte, die aus der ursprünglichen Verteilung stammen, sondern aus den Indizes des von zurückgegebenen Arrays np.linspace(ymin, ymax, N).

Verwenden Sie die set_yticklabels()Methode, um N Werte anzuzeigen, die gleichmäßig von Ihren ursprünglichen Tick-Beschriftungen entfernt sind . Hier ist ein Ausschnitt für die y-Achse mit ganzzahligen Beschriftungen:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)
Tantris
quelle
Ein großes Lob für diesen schönen Tweak!
Mohd
2

Wenn eine Protokollskala verwendet wird, kann die Anzahl der Hauptstriche mit dem folgenden Befehl festgelegt werden

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

Der festgelegte Wert numticksbestimmt die Anzahl der anzuzeigenden Achsenticks.

Dank an @ bgamaris Beitrag für die Einführung der locator_params()Funktion, aber der nticksParameter gibt einen Fehler aus, wenn eine Protokollskala verwendet wird.

Ébe Isaac
quelle
Die Frage und Antwort sind für vorherige matplotlib, dh 1, und Sie beziehen sich auf 2.
Dawid Laszuk