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:
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:
Irgendwelche Ideen, wie ich die Achsenwerte ändern kann, um die von mir verwendeten Eingabedaten widerzuspiegeln?
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
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