Changer les valeurs sur l'axe graphique matplotlib imshow ()

89

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:

entrez la description de l'image ici

Cependant, les valeurs de l'axe des x ne correspondent pas aux données d'entrée (c.-à-d. Moyenne de 100, allant de 80 à 122). Par conséquent, j'aimerais changer l'axe des x pour afficher les valeurs dans 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:

entrez la description de l'image ici

Des idées sur la façon dont je peux modifier les valeurs des axes pour refléter les données d'entrée que j'utilise?

atomh33ls
la source
Utilisez pcolorplutôt imshowque comme mentionné dans cette réponse .
Nirmal

Réponses:

142

J'essaierais d'éviter de changer le xticklabelssi possible, sinon cela peut devenir très déroutant si vous surplottez votre histogramme avec des données supplémentaires par exemple.

Définir la plage de votre grille est probablement la meilleure et avec imshowcela peut être fait en ajoutant le extentmot - clé. De cette façon, les axes sont ajustés automatiquement. Si vous voulez changer les étiquettes, j'utiliserais set_xtickspeut-être avec un formateur. La modification directe des étiquettes devrait ê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

entrez la description de l'image ici

Rutger Kassies
la source
18
Il convient également de noter que nous interpolation="none"avons utilisé ici une représentation beaucoup plus précise de données réelles.
Accroché le
4
Une réponse très utile; Je l'ai utilisé pour créer un graphique en couleurs d'une fonction de deux variables (à savoir, les données sismiques). J'ai également ajouté l'option "aspect = 'auto'" dans imshow () pour que je puisse 'étirer et presser' l'affichage sismique.
Kurt Peek
10

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

Afficher votre image avec matplotlib.pyplot.imshow est généralement un moyen rapide d'afficher des données 2D. Cependant, cela é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 les tableaux x et y, vous pouvez utiliser matplotlib.pyplot.xticks et matplotlib.pyplot.yticks pour étiqueter les axes x et y en utilisant les valeurs de ces tableaux. Celles-ci associeront certaines étiquettes, correspondant aux données réelles de la grille, au nombre de pixels sur les axes. Et faire cela est beaucoup plus rapide que d'utiliser 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
rxs
la source