Riparare troppe zecche #

Una causa comune per il comportamento imprevisto del tick è il passaggio di un elenco di stringhe invece di numeri o oggetti datetime. Questo può facilmente accadere senza preavviso durante la lettura in un file di testo delimitato da virgole. Matplotlib tratta gli elenchi di stringhe come variabili categoriche ( Plotting categorical variable ), e per impostazione predefinita inserisce un segno di spunta per categoria e le traccia nell'ordine in cui vengono fornite. Se ciò non è desiderato, la soluzione consiste nel convertire le stringhe in un tipo numerico come negli esempi seguenti.

Esempio 1: le stringhe possono portare a un ordine inatteso di tick numerici #

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 2, constrained_layout=True, 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')
I segni di spunta sembrano fuori uso / fuori posto, i segni di spunta come previsto
Text(0.5, 1.0, 'Ticks as expected')

Esempio 2: le stringhe possono portare a molti tick #

Se x ha 100 elementi, tutte stringhe, allora avremmo 100 tick (illeggibili), e ancora una volta la soluzione è convertire le stringhe in float:

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')
Troppi tick, x convertiti in numeri
Text(0.5, -3.555555555555568, 'Floats')

Esempio 3: le stringhe possono portare a un ordine imprevisto di tick datetime #

Un caso comune è quando le date vengono lette da un file CSV, devono essere convertite da stringhe in oggetti datetime per ottenere i localizzatori e i formattatori di data appropriati.

fig, ax = plt.subplots(1, 2, constrained_layout=True, 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()
Date fuori servizio, x convertite in datetimes

Tempo di esecuzione totale dello script: (0 minuti 1,403 secondi)

Galleria generata da Sphinx-Gallery