Zu viele Ticks beheben#

Eine häufige Ursache für unerwartetes Tick-Verhalten ist die Übergabe einer Liste von Zeichenketten anstelle von Zahlen oder Datumsobjekten. Dies kann leicht unbemerkt geschehen, wenn eine durch Kommas getrennte Textdatei eingelesen wird. Matplotlib behandelt Listen von Zeichenketten als kategoriale Variablen (Plotten kategorialer Variablen) und platziert standardmäßig einen Tick pro Kategorie, wobei diese in der Reihenfolge geplottet werden, in der sie übergeben werden. Wenn dies nicht gewünscht ist, besteht die Lösung darin, die Zeichenketten wie in den folgenden Beispielen in einen numerischen Typ umzuwandeln.

Beispiel 1: Zeichenketten können zu einer unerwarteten Reihenfolge von Zahlenticks führen#

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 2, layout='constrained', figsize=(6, 2.5))
x = ['1', '5', '2', '3']
y = [1, 4, 2, 3]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', color='r', labelcolor='r')
ax[0].set_xlabel('Categories')
ax[0].set_title('Ticks seem out of order / misplaced')

# convert to numbers:
x = np.asarray(x, dtype='float')
ax[1].plot(x, y, 'd')
ax[1].set_xlabel('Floats')
ax[1].set_title('Ticks as expected')
Ticks seem out of order / misplaced, Ticks as expected

Beispiel 2: Zeichenketten können zu sehr vielen Ticks führen#

Wenn x 100 Elemente hat, alle Zeichenketten sind, dann hätten wir 100 (unleserliche) Ticks, und wieder ist die Lösung, die Zeichenketten in Gleitkommazahlen umzuwandeln

fig, ax = plt.subplots(1, 2, figsize=(6, 2.5))
x = [f'{xx}' for xx in np.arange(100)]
y = np.arange(100)
ax[0].plot(x, y)
ax[0].tick_params(axis='x', color='r', labelcolor='r')
ax[0].set_title('Too many ticks')
ax[0].set_xlabel('Categories')

ax[1].plot(np.asarray(x, float), y)
ax[1].set_title('x converted to numbers')
ax[1].set_xlabel('Floats')
Too many ticks, x converted to numbers

Beispiel 3: Zeichenketten können zu einer unerwarteten Reihenfolge von Datumsticken führen#

Ein häufiger Fall ist, wenn Daten aus einer CSV-Datei gelesen werden; sie müssen von Zeichenketten in Datumsobjekte konvertiert werden, um die richtigen Datums-Locators und -Formatierer zu erhalten.

fig, ax = plt.subplots(1, 2, layout='constrained', figsize=(6, 2.75))
x = ['2021-10-01', '2021-11-02', '2021-12-03', '2021-09-01']
y = [0, 2, 3, 1]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelrotation=90, color='r', labelcolor='r')
ax[0].set_title('Dates out of order')

# convert to datetime64
x = np.asarray(x, dtype='datetime64[s]')
ax[1].plot(x, y, 'd')
ax[1].tick_params(axis='x', labelrotation=90)
ax[1].set_title('x converted to datetimes')

plt.show()
Dates out of order, x converted to datetimes

Gesamtlaufzeit des Skripts: (0 Minuten 2.115 Sekunden)

Galerie generiert von Sphinx-Gallery