Ändern der Tickfrequenz auf der x- oder y-Achse

Lesezeit: 7 Minuten

Benutzeravatar von Dax Feliz
Dax Feliz

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

Benutzeravatar von unutbu
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,

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

Hier ist ein lauffähiges 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's user avatar
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.

    – Roboterchat

    29. April 2020 um 17:22 Uhr


Ich mag diese Lösung (von der Matplotlib-Plotting-Kochbuch):

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])

Choldgrafs Benutzeravatar
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


Benutzeravatar von Gary Steele
Gary Steele

Wenn Sie nur den Abstand festlegen möchten, verwenden Sie einen einfachen Einzeiler mit minimalem Textbaustein:

plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1))

funktioniert auch problemlos für kleinere Ticks:

plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(1))

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.

1400000cookie-checkÄndern der Tickfrequenz auf der x- oder y-Achse

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy