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:
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:
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?
python
numpy
matplotlib
atomh33ls
la source
la source
pcolor
plutôtimshow
que comme mentionné dans cette réponse .Réponses:
J'essaierais d'éviter de changer le
xticklabels
si 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
imshow
cela peut être fait en ajoutant leextent
mot - clé. De cette façon, les axes sont ajustés automatiquement. Si vous voulez changer les étiquettes, j'utiliseraisset_xticks
peut-ê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
la source
interpolation="none"
avons utilisé ici une représentation beaucoup plus précise de données réelles.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
la source