2014-04-17 31 views
6

Desidero creare una figura composta da nove sottotrame. Ho davvero odiato il fatto che avevo bisogno di creare ax1 in ax9 separatamente, così ho creato un ciclo for per farlo. Tuttavia, quando voglio includere una barra di colore, la barra dei colori è posizionata a destra dell'ultima sottotrama. Questo è dimostrato anche nella figura seguente:Posizionamento errato della barra dei colori quando si utilizzano sottotrame (matplotlib)

enter image description here

cosa non va e come posso risolvere questo problema?

L'immagine è stata generata con il seguente codice:

import numpy 
import layout 
import matplotlib.pylab as plt 

data = numpy.random.random((10, 10)) 

test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"] 

fig = plt.figure(1) 

for idx in range(len(test)): 
    vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1)) 

im = ax1.imshow(data) 
plt.colorbar(im) 

im2 = ax3.imshow(data) 
plt.colorbar(im2) 

plt.show() 

risposta

3

ho trovato la risposta alla mia domanda, con la conseguente corretta colorbar vs spaziatura sottotrama. Si noti che se la spaziatura tra sottotrama e colorbar non ha importanza, la risposta di Molly è corretta.

import numpy 
import layout 
import matplotlib.pylab as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

data = numpy.random.random((10, 10)) 

test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"] 

fig = plt.figure(1) 

for idx in range(len(test)): 
    vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1)) 
    divider = make_axes_locatable(vars()[test[idx]]) 
    vars()["c" + test[idx]] = divider.append_axes("right", size = "5%", pad = 0.05) 


im1 = ax1.imshow(data) 
plt.colorbar(im1, cax = cax1) 

im2 = ax2.imshow(data) 
plt.colorbar(im2, cax = cax2) 

im3 = ax3.imshow(data) 
plt.colorbar(im3, cax = cax3) 

im4 = ax4.imshow(data) 
plt.colorbar(im4, cax = cax4) 

im5 = ax5.imshow(data) 
plt.colorbar(im5, cax = cax5) 

im6 = ax6.imshow(data) 
plt.colorbar(im6, cax = cax6) 

im7 = ax7.imshow(data) 
plt.colorbar(im7, cax = cax7) 

im8 = ax8.imshow(data) 
plt.colorbar(im8, cax = cax8) 

im9 = ax9.imshow(data) 
plt.colorbar(im9, cax = cax9) 

plt.show() 

Ciò comporta:

enter image description here

10

colorbar prende un argomento ax gli "assi madri oggetto (s) da cui verrà rubato spazio per nuovi assi colorbar". Nel tuo codice potresti fare qualcosa del genere per aggiungere una barra colorata accanto a un asse:

im = ax1.imshow(data) 
plt.colorbar(im, ax = ax1) 
+0

Questo è un po 'più elegante della soluzione che ho trovato. Tuttavia, la spaziatura tra la sottotrama e la barra di colore è piuttosto grande. Qualche idea? –

+0

Prova plt.tight_layout() – Molly

0

La risposta del tizio è grandiosa. Tuttavia preferirei evitare il copia-incolla usando questo:

import numpy 
import matplotlib.pylab as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

data = numpy.random.random((10, 10)) 

test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"] 

fig = plt.figure(1) 

for idx in range(len(test)): 
    vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1)) 
    divider = make_axes_locatable(vars()[test[idx]]) 
    vars()["c" + test[idx]] = divider.append_axes("right", size = "5%", pad = 0.05) 

    vars()["im" + str(idx)] = vars()[test[idx]].imshow(data) 
    plt.colorbar(vars()["im" + str(idx)], cax = vars()["c" + test[idx]]) 

plt.show() 

Il risultato è lo stesso.

+0

Inoltre è possibile rendere personalizzato il numero di grafici, semplicemente creando un elenco di test per il numero specificato di grafici. –