Hinweis
Gehen Sie zum Ende, um den vollständigen Beispielcode herunterzuladen.
Mehrstufige (verschachtelte) Ticks#
Manchmal möchten wir eine weitere Ebene von Tick-Beschriftungen auf einer Achse haben, vielleicht um eine Gruppierung der Ticks anzuzeigen.
Matplotlib bietet keine automatische Möglichkeit, dies zu tun, aber es ist relativ einfach, unterhalb der Hauptachse zu annotieren.
Diese Beispiele verwenden Axes.secondary_xaxis, was ein Ansatz ist. Dies hat den Vorteil, dass wir bei Bedarf Matplotlib Locators und Formatters auf der Achse verwenden können, die die Gruppierung vornimmt.
Dieses erste Beispiel erstellt eine sekundäre x-Achse und fügt die Ticks und Beschriftungen manuell mit Axes.set_xticks hinzu. Beachten Sie, dass die Tick-Beschriftungen einen Zeilenumbruch (z. B. " Oughts") am Anfang haben, um die Tick-Beschriftungen der zweiten Ebene unterhalb der Haupt-Tick-Beschriftungen zu platzieren.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
rng = np.random.default_rng(19680801)
fig, ax = plt.subplots(layout='constrained', figsize=(4, 4))
ax.plot(np.arange(30))
sec = ax.secondary_xaxis(location=0)
sec.set_xticks([5, 15, 25], labels=['\nOughts', '\nTeens', '\nTwenties'])

Dieses zweite Beispiel fügt einer kategorialen Achse eine zweite Annotationsebene hinzu. Hier müssen wir beachten, dass jedem Tier (Kategorie) eine Ganzzahl zugewiesen wird, sodass cats bei x=0, dogs bei x=1 usw. ist. Dann platzieren wir die Ticks der zweiten Ebene auf einer x-Achse, die sich in der Mitte der Tierklasse befindet, die wir abgrenzen möchten.
Dieses Beispiel fügt auch Tick-Markierungen zwischen den Klassen hinzu, indem eine zweite sekundäre x-Achse hinzugefügt und lange, breite Ticks an den Grenzen zwischen den Tierklassen platziert werden.
fig, ax = plt.subplots(layout='constrained', figsize=(7, 4))
ax.plot(['cats', 'dogs', 'pigs', 'snakes', 'lizards', 'chickens',
'eagles', 'herons', 'buzzards'],
rng.normal(size=9), 'o')
# label the classes:
sec = ax.secondary_xaxis(location=0)
sec.set_xticks([1, 3.5, 6.5], labels=['\n\nMammals', '\n\nReptiles', '\n\nBirds'])
sec.tick_params('x', length=0)
# lines between the classes:
sec2 = ax.secondary_xaxis(location=0)
sec2.set_xticks([-0.5, 2.5, 4.5, 8.5], labels=[])
sec2.tick_params('x', length=40, width=1.5)
ax.set_xlim(-0.6, 8.6)

Daten sind ein weiterer häufiger Fall, in dem wir eine zweite Ebene von Tick-Beschriftungen wünschen könnten. In diesem letzten Beispiel nutzen wir die Möglichkeit, der sekundären x-Achse einen automatischen Locator und Formatter hinzuzufügen, was bedeutet, dass wir die Ticks nicht manuell setzen müssen.
Dieses Beispiel unterscheidet sich auch von den obigen dadurch, dass wir es an einer Position unterhalb der Hauptachsen location=-0.075 platziert und dann die Achse ausgeblendet haben, indem wir die Linienbreite auf Null gesetzt haben. Das bedeutet, dass unser Formatter die Wagenrückläufe der beiden vorherigen Beispiele nicht mehr benötigt.
fig, ax = plt.subplots(layout='constrained', figsize=(7, 4))
time = np.arange(np.datetime64('2020-01-01'), np.datetime64('2020-03-31'),
np.timedelta64(1, 'D'))
ax.plot(time, rng.random(size=len(time)))
# just format the days:
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d'))
# label the months:
sec = ax.secondary_xaxis(location=-0.075)
sec.xaxis.set_major_locator(mdates.MonthLocator(bymonthday=1))
# note the extra spaces in the label to align the month label inside the month.
# Note that this could have been done by changing ``bymonthday`` above as well:
sec.xaxis.set_major_formatter(mdates.DateFormatter(' %b'))
sec.tick_params('x', length=0)
sec.spines['bottom'].set_linewidth(0)
# label the xaxis, but note for this to look good, it needs to be on the
# secondary xaxis.
sec.set_xlabel('Dates (2020)')
plt.show()

Gesamtlaufzeit des Skripts: (0 Minuten 2,807 Sekunden)