2013-08-01 17 views
16

Desidero creare 4 sottotrotme imshow ma tutte condividono la stessa mappa colori. Matplotlib regola automaticamente la scala sulla mappa colori in base alle voci delle matrici. Ad esempio, se una delle mie matrici ha tutte le entrate come 10 e l'altra ha tutte le voci uguali a 5 e io uso la colormap Greys, una delle mie sottotrame dovrebbe essere completamente nera e l'altra dovrebbe essere completamente grigia. Ma entrambi finiscono per diventare completamente neri. Come rendere tutte le sottotrame condividono la stessa scala sulla mappa dei colori?Imagine sottotrame con la stessa barra dei colori

+0

Sembra che questo post ha una risposta che potrebbe aiutare. http://stackoverflow.com/questions/3373256/set-colorbar-range-in-matplotlib – bserra

+0

possibile duplicato di [Sottotrammi Matplotlib 2, 1 Colorbar] (http://stackoverflow.com/questions/13784201/matplotlib-2- subplots-1-colorbar) –

risposta

27

Per ottenere questo diritto è necessario disporre di tutte le immagini con la stessa intensità, altrimenti i colori colorbar() non hanno senso. Per fare ciò, utilizzare gli argomenti vmin e vmax di imshow() e accertarsi che siano uguali per tutte le immagini.

Ad esempio, se l'intervallo di valori che si desidera mostrare va da 0 a 10, è possibile utilizzare il seguente:

import pylab as plt 
import numpy as np 
my_image1 = np.linspace(0, 10, 10000).reshape(100,100) 
my_image2 = np.sqrt(my_image1.T) + 3 
subplot(1, 2, 1) 
plt.imshow(my_image1, vmin=0, vmax=10, cmap='jet', aspect='auto') 
plt.subplot(1, 2, 2) 
plt.imshow(my_image2, vmin=0, vmax=10, cmap='jet', aspect='auto') 
plt.colorbar() 

enter image description here

+0

non molto bello dato che il secondo asse è più stretto, vedi http://stackoverflow.com/questions/13784201/matplotlib-2-subplots-1-colorbar invece –

+0

@RuggeroTurra True, ma questo è dovuto all'aspetto = 'auto'' e in ogni caso può essere regolato cambiando gli spazi sottotrama (o ad es. gridspec). Nella risposta accettata che colleghi la barra dei colori non è alta come gli assi, quindi sono necessarie alcune regolazioni. – tiago

1

Può essere che non si conosce in anticipo il intervalli di dati, ma potresti sapere che in qualche modo sono compatibili. In tal caso, potresti preferire che matplotlib scelga tali intervalli per il primo grafico e utilizzi lo stesso intervallo per i restanti grafici. Ecco come puoi farlo. La chiave è quello di ottenere i limiti con properties()['clim']

import numpy as np 
import matplotlib.pyplot as plt 

my_image1 = np.linspace(0, 10, 10000).reshape(100,100) 
my_image2 = np.sqrt(my_image1.T) + 3 

fig, axes = plt.subplots(nrows=1, ncols=2) 
im = axes[0].imshow(my_image1) 
clim=im.properties()['clim'] 
axes[1].imshow(my_image2, clim=clim) 

fig.colorbar(im, ax=axes.ravel().tolist(), shrink=0.5) 

plt.show() 
+0

Non funzionerà se l'intervallo di valori nel primo grafico è inferiore all'intervallo nel secondo grafico. – naught101

+0

concordato. Ma questo è quello che ho spiegato nel testo. Ciò funzionerà se non si conoscono gli intervalli migliori ma si presume che gli intervalli automatici per il primo grafico corrispondano a quelli rimanenti. –

Problemi correlati