it-swarm.com.de

Ändern Sie die Werte für die Diagrammachse matplotlib imshow ()

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 mit imshow() plotten:

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

bekommen: 

enter image description here

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

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:

enter image description here

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

58
atomh33ls

Ich würde versuchen, das Ändern der Variable xticklabels möglichst zu vermeiden, ansonsten kann es sehr verwirrend werden, wenn Sie beispielsweise Ihr Histogramm mit zusätzlichen Daten überschreiben. 

Das Definieren des Bereichs Ihres Gitters ist wahrscheinlich das Beste. Mit imshow können Sie das Schlüsselwort extent hinzufügen. Auf diese Weise werden die Achsen automatisch angepasst. Wenn Sie die Beschriftungen ändern möchten, würde ich set_xticks mit vielleicht etwas Formatierungsprogramm 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

enter image description here

96
Rutger Kassies

Ich hatte ein ähnliches Problem und Google schickte mich zu diesem Beitrag. 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 matplotlib.pyplot.xticks und matplotlib.pyplot.yticks verwenden, um die x- und y-Achsen mit den Werten in diesen Arrays zu kennzeichnen. Diese ordnen den Pixelzahlen auf den Achsen einige Beschriftungen zu, die den tatsächlichen Rasterdaten entsprechen. Und das geht viel schneller als beispielsweise 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
0
rxs