web-dev-qa-db-fra.com

Comment changer l'espacement entre les tiques dans matplotlib?

Je veux tracer un graphique avec beaucoup de graduations sur l'axe X en utilisant le code suivant:

import pylab

N = 100
data = pylab.np.linspace(0, N, N)

pylab.plot(data)

pylab.xticks(range(N)) # add loads of ticks
pylab.grid()
pylab.tight_layout()
pylab.show()

pylab.close()

L'intrigue résultante ressemble à ceci:

plot

Comme vous pouvez le voir, l'axe X est un gâchis parce que les étiquettes de graduation sont tracées avec trop peu d'espace entre elles ou même se chevauchent .

J'aimerais créer automatiquement un espace constant entre chaque étiquette de tick, quel que soit le nombre de ticks. Donc, je voudrais augmenter l'espace entre les tiques individuelles, augmentant ainsi potentiellement la "longueur" d'un tracé.

Notez que les étiquettes de graduation peuvent être des chaînes de longueur variable .

Ce que j'ai trouvé jusqu'à présent concerne espacement entre l'axe et les étiquettes (ce qui n'est pas ce que je veux), fréquence des ticks (ce que je peux déjà faire) et - cocher les paramètres (qui ne semblent pas avoir d'options pour l'espacement).

Je peux changer la taille d'une figure manuellement avec matplotlib.pyplot.figure(figsize=(a, b)), mais cela nécessiterait la connaissance de l'espacement par défaut entre les tiques (il n'y en a pas, pour autant que je sache) et la plus grande largeur (en pouces) d'un cochez l'étiquette, que je ne sais pas comment mesurer, donc ce n'est pas une option, à mon avis.

Que puis-je faire pour augmenter l'espacement entre les tiques? Je suis d'accord pour obtenir une image assez longue.

17
ForceBru

L'espacement entre les graduations est exclusivement déterminé par l'espace entre les graduations sur les axes. Par conséquent, la seule façon d'obtenir plus d'espace entre des étiquettes de ticks données est d'agrandir les axes.

Afin de déterminer l'espace nécessaire pour que les étiquettes ne se chevauchent pas, on peut trouver la plus grande étiquette et multiplier sa longueur par le nombre d'étiquettes. On peut ensuite adapter la marge autour des axes et définir la taille calculée comme une nouvelle taille de figure.

import numpy as np
import matplotlib.pyplot as plt

N = 150
data = np.linspace(0, N, N)

plt.plot(data)

plt.xticks(range(N)) # add loads of ticks
plt.grid()

plt.gca().margins(x=0)
plt.gcf().canvas.draw()
tl = plt.gca().get_xticklabels()
maxsize = max([t.get_window_extent().width for t in tl])
m = 0.2 # inch margin
s = maxsize/plt.gcf().dpi*N+2*m
margin = m/plt.gcf().get_size_inches()[0]

plt.gcf().subplots_adjust(left=margin, right=1.-margin)
plt.gcf().set_size_inches(s, plt.gcf().get_size_inches()[1])

plt.savefig(__file__+".png")
plt.show()

enter image description here

Notez que si la figure affichée dans la fenêtre de traçage est plus grande que l'écran, elle sera à nouveau réduite, de sorte que la figure redimensionnée n'est affichée dans sa nouvelle taille qu'une fois enregistrée. Ou, on peut choisir de l'incorporer dans une fenêtre avec des barres de défilement comme indiqué dans cette question: Barre de défilement sur la page d'affichage de Matplotlib

13

Vous pouvez utiliser ce qui suit pour faire pivoter les étiquettes et réduire la police:

ax.set_xticklabels(rotation = (45), fontsize = 10, va='bottom', ha='left')
0
serafeim