Noter
Cliquez ici pour télécharger l'exemple de code complet
Correction de trop de ticks #
Une cause courante de comportement inattendu des ticks est la transmission d'une liste de chaînes au lieu de nombres ou d'objets datetime. Cela peut facilement se produire sans préavis lors de la lecture d'un fichier texte délimité par des virgules. Matplotlib traite les listes de chaînes comme des variables catégorielles ( Plotting categorical variables ), et met par défaut une coche par catégorie, et les trace dans l'ordre dans lequel elles sont fournies. Si cela n'est pas souhaité, la solution consiste à convertir les chaînes en un type numérique comme dans les exemples suivants.
Exemple 1 : les chaînes peuvent entraîner un ordre inattendu des ticks numériques #
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')
Text(0.5, 1.0, 'Ticks as expected')
Exemple 2 : Les chaînes peuvent entraîner de très nombreux ticks #
Si x a 100 éléments, toutes des chaînes, alors nous aurions 100 ticks (illisibles), et encore une fois la solution est de convertir les chaînes en flottants :
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')
Text(0.5, -3.555555555555568, 'Floats')
Exemple 3 : les chaînes peuvent entraîner un ordre inattendu des ticks datetime #
Un cas courant est lorsque les dates sont lues à partir d'un fichier CSV, elles doivent être converties de chaînes en objets datetime pour obtenir les localisateurs et formateurs de date appropriés.
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()
Durée totale d'exécution du script : (0 minutes 1,403 secondes)