111 votes

Changement des valeurs sur l'axe du graphique matplotlib imshow()

Disons que j'ai des données d'entrée :

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

Je peux le tracer en utilisant imshow() :

plt.imshow(hist,cmap='Reds')

obtenir :

enter image description here

Cependant, les valeurs de l'axe des x ne correspondent pas aux données d'entrée (c'est-à-dire une moyenne de 100, une fourchette de 80 à 122). Par conséquent, j'aimerais modifier l'axe des x afin d'afficher les valeurs dans le tableau ci-dessous. edges .

J'ai essayé :

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

et

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

enter image description here

Avez-vous une idée de la façon dont je peux modifier les valeurs des axes pour refléter les données d'entrée que j'utilise ?

178voto

Rutger Kassies Points 7713

J'essaierais d'éviter de modifier le xticklabels si possible, sinon cela peut devenir très confus si, par exemple, vous surplombez votre histogramme avec des données supplémentaires.

Définir la plage de votre grille est probablement le meilleur moyen et avec imshow il est possible de le faire en ajoutant l'option extent mot-clé. De cette façon, les axes sont ajustés automatiquement. Si vous voulez changer les étiquettes, j'utiliserais set_xticks avec peut-être un formateur. La modification directe des étiquettes doit être le dernier recours.

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

enter image description here

13voto

rcojocaru Points 161

J'ai eu un problème similaire et google m'a renvoyé vers ce post. Ma solution était un peu différente et moins compacte, mais j'espère que cela pourra être utile à quelqu'un.

L'affichage de votre image avec matplotlib.pyplot.imshow est généralement un moyen rapide d'afficher des données 2D. Cependant, cette méthode étiquette par défaut les axes avec le nombre de pixels. Si les données 2D que vous tracez correspondent à une grille uniforme définie par des tableaux x et y, alors vous pouvez utiliser matplotlib.pyplot.xticks et matplotlib.pyplot.yticks pour étiqueter les axes x et y en utilisant les valeurs de ces tableaux. Ceux-ci associeront des étiquettes, correspondant aux données réelles de la grille, au nombre de pixels sur les axes. Cette méthode est beaucoup plus rapide que l'utilisation de quelque chose comme pcolor par exemple.

Voici une tentative avec vos données :

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case

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