726 votes

Modification de la "fréquence de tic" sur l'axe x ou y dans matplotlib

J'essaie de corriger la façon dont Python trace mes données. Dites :

x = [0,5,9,10,15]
y = [0,1,2,3,4]

matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()

Les ticks de l'axe des x sont tracés par intervalles de 5. Existe-t-il un moyen d'afficher des intervalles de 1 ?

13 votes

Bien que ticks soit le mot approprié ici, changer ticks en step size guidera certainement plus de néophytes à cette question.

11 votes

Question étroitement liée : stackoverflow.com/questions/6682784/ et une excellente solution : pyplot.locator_params(nbins=4)

0 votes

Nbins semble avoir été déprécié dans matplotlib2.x, malheureusement.

867voto

unutbu Points 222216

Vous pouvez définir explicitement où vous voulez cocher les marques avec plt.xticks :

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

Par exemple,

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 a été utilisée plutôt que la méthode Python range juste au cas où min(x) y max(x) sont des flottants au lieu d'ints).


El plt.plot (ou ax.plot ) définira automatiquement la valeur par défaut de la fonction x y y limites. Si vous souhaitez conserver ces limites, et simplement modifier la taille des pas des marques de tic-tac, vous pouvez alors utiliser ax.get_xlim() pour découvrir les limites déjà fixées par Matplotlib.

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

Le formateur de tick par défaut devrait faire un travail décent en arrondissant les valeurs de tick à un nombre raisonnable de chiffres significatifs. Cependant, si vous souhaitez avoir plus de contrôle sur le format, vous pouvez définir votre propre formateur. Par exemple,

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

Voici un exemple exécutable :

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

115 votes

N'y a-t-il pas moyen de faire en sorte qu'il décide de ses propres limites, mais qu'il modifie simplement la taille du pas ? Cette méthode n'est pas très bonne si le min est quelque chose comme 3523.232512 !

3 votes

@Corone, Cela fait un moment que vous avez demandé, mais j'ai posté une réponse ci-dessous qui permet un contrôle facile de la taille du pas tout en utilisant la détermination automatique des limites.

5 votes

Notez que le +1 sur plt.xticks(np.arange(min(x), max(x)+1, 1.0)) est nécessaire pour afficher la dernière marque de coche.

284voto

robochat Points 88

Une autre approche consiste à définir le localisateur d'axe :

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

Il existe plusieurs types de localisateurs en fonction de vos besoins.

Voici un exemple complet :

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) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
plt.show()

8 votes

Cela ne fonctionne pas comme prévu. Plus précisément, lorsqu'il utilise des dates, il n'utilise pas les dates appropriées.

54 votes

Lorsque vous utilisez des dates, vous devez utiliser les méthodes du module matplotlib.dates. Par exemple matplotlib.dates.AutoDateLocator()

6 votes

Cela a fonctionné comme prévu pour moi, avec des dates. Cette solution est beaucoup plus facile que la solution acceptée.

189voto

jthomas Points 1981

J'aime cette solution (tirée du Livre de cuisine sur le traçage avec Matplotlib ):

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

Cette solution vous donne un contrôle explicite de l'espacement des tics via le nombre donné à ticker.MultipleLocater() permet de déterminer automatiquement les limites et est facile à lire par la suite.

150voto

glopes Points 90

Au cas où quelqu'un serait intéressé par une solution générale, il suffit d'obtenir les ticks actuels et de les utiliser pour définir les nouveaux ticks en échantillonnant un tick sur deux.

ax.set_xticks(ax.get_xticks()[::2])

47voto

Gary Steele Points 181

Si vous voulez simplement définir l'espacement, une simple ligne avec un minimum de texte passe-partout :

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

fonctionne aussi facilement pour les tiques mineures :

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

un peu une bouchée, mais assez compacte

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X