Ändern Sie die Werte auf der Diagrammachse von matplotlib imshow ()

89

Angenommen, ich habe einige Eingabedaten:

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

Ich kann es zeichnen mit imshow():

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

bekommen:

Geben Sie hier die Bildbeschreibung ein

Die x-Achsenwerte stimmen jedoch nicht mit den Eingabedaten überein (dh Mittelwert von 100, Bereich von 80 bis 122). Daher möchte ich die x-Achse ändern, um die Werte in anzuzeigen edges.

Ich habe versucht:

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

und

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

Geben Sie hier die Bildbeschreibung ein

Irgendwelche Ideen, wie ich die Achsenwerte ändern kann, um die von mir verwendeten Eingabedaten widerzuspiegeln?

atomh33ls
quelle
Verwenden Sie pcolorstatt imshowwie in dieser Antwort erwähnt .
Nirmal

Antworten:

142

Ich würde versuchen, das Ändern xticklabelsmöglichst zu vermeiden , da es sonst sehr verwirrend werden kann, wenn Sie beispielsweise Ihr Histogramm mit zusätzlichen Daten überzeichnen.

Das Definieren des Bereichs Ihres Rasters ist wahrscheinlich das Beste und imshowkann durch Hinzufügen des extentSchlüsselworts erfolgen. Auf diese Weise werden die Achsen automatisch angepasst. Wenn Sie die Beschriftungen ändern möchten, würde ich set_xticksmit vielleicht etwas Formatierer verwenden. Das direkte Ändern der Etiketten sollte der letzte Ausweg sein.

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

Geben Sie hier die Bildbeschreibung ein

Rutger Kassies
quelle
18
Es ist auch erwähnenswert, dass interpolation="none"hier eine weitaus genauere Darstellung realer Daten verwendet wurde.
Hooked
4
Eine sehr nützliche Antwort; Ich habe es verwendet, um ein Farbdiagramm einer Funktion von zwei Variablen (nämlich seismischen Daten) zu erstellen. Ich habe auch die Option "Aspekt = 'Auto'" in imshow () hinzugefügt, damit ich die seismische Anzeige 'dehnen und quetschen' kann.
Kurt Peek
10

Ich hatte ein ähnliches Problem und Google hat mich zu diesem Beitrag geschickt. Meine Lösung war etwas anders und weniger kompakt, aber hoffentlich kann dies für jemanden nützlich sein.

Das Anzeigen Ihres Bildes mit matplotlib.pyplot.imshow ist im Allgemeinen eine schnelle Möglichkeit, 2D-Daten anzuzeigen. Dies kennzeichnet jedoch standardmäßig die Achsen mit der Pixelanzahl. Wenn die 2D-Daten, die Sie zeichnen, einem einheitlichen Raster entsprechen, das durch die Arrays x und y definiert ist, können Sie die x- und y-Achsen mit matplotlib.pyplot.xticks und matplotlib.pyplot.yticks mit den Werten in diesen Arrays beschriften. Diese ordnen einige Beschriftungen, die den tatsächlichen Gitterdaten entsprechen, den Pixelzahlen auf den Achsen zu. Und das geht viel schneller als zum Beispiel mit pcolor.

Hier ist ein Versuch mit Ihren Daten:

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
quelle