Modificare i valori sull'asse del grafico matplotlib imshow ()


90

Diciamo che ho alcuni dati di input:

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

Posso tracciarlo usando imshow():

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

ottenere:

inserisci qui la descrizione dell'immagine

Tuttavia, i valori dell'asse x non corrispondono ai dati di input (cioè la media di 100, gamma da 80 a 122). Pertanto, vorrei modificare l'asse x per mostrare i valori in edges.

Ho provato:

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

e

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

inserisci qui la descrizione dell'immagine

Qualche idea su come posso modificare i valori degli assi per riflettere i dati di input che sto utilizzando?


Utilizzare pcolorinvece di imshowcome menzionato in questa risposta .
Nirmal

Risposte:


144

Cercherei di evitare di modificare il xticklabelsse possibile, altrimenti può creare molta confusione se ad esempio sovrastampi il tuo istogramma con dati aggiuntivi.

Definire l'intervallo della tua griglia è probabilmente il migliore e con imshowesso può essere fatto aggiungendo la extentparola chiave. In questo modo gli assi vengono regolati automaticamente. Se vuoi cambiare le etichette, userei set_xticksforse con qualche formattatore. Modificare direttamente le etichette dovrebbe essere l'ultima risorsa.

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

inserisci qui la descrizione dell'immagine


18
Vale anche la pena notare che è interpolation="none"stata utilizzata qui, una rappresentazione molto più accurata dei dati reali.
Agganciato il

4
Una risposta utilissima; L'ho usato per creare un grafico a colori di una funzione di due variabili (vale a dire, dati sismici). Ho anche aggiunto l'opzione "aspect = 'auto'" in imshow () in modo da poter "allungare e comprimere" il display sismico.
Kurt Peek

11

Ho avuto un problema simile e Google mi ha inviato a questo post. La mia soluzione era un po 'diversa e meno compatta, ma spero che possa essere utile a qualcuno.

Mostrare la tua immagine con matplotlib.pyplot.imshow è generalmente un modo veloce per visualizzare i dati 2D. Tuttavia, per impostazione predefinita, questo etichetta gli assi con il numero di pixel. Se i dati 2D che si stanno tracciando corrispondono a una griglia uniforme definita dagli array xey, è possibile utilizzare matplotlib.pyplot.xticks e matplotlib.pyplot.yticks per etichettare gli assi xey utilizzando i valori in tali array. Questi assoceranno alcune etichette, corrispondenti ai dati effettivi della griglia, ai conteggi dei pixel sugli assi. E farlo è molto più veloce che usare qualcosa come pcolor, ad esempio.

Ecco un tentativo con i tuoi dati:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.