2014-04-17 11 views
6

Chcę utworzyć figurę składającą się z dziewięciu wątków. Naprawdę nienawidziłem faktu, że potrzebowałem stworzyć ax1 do ax9 osobno, więc stworzyłem pętlę for, aby to zrobić. Jeśli jednak chcę dołączyć pasek kolorów, pasek kolorów znajduje się na prawo od ostatniego wątku. Jest to również pokazano na poniższym rysunku:Niewłaściwe pozycjonowanie paska koloru podczas korzystania z subplots (matplotlib)

enter image description here

Co jest nie tak i jak to naprawić?

Obraz został wygenerowany za pomocą następującego kodu:

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

Odpowiedz

3

znalazłem odpowiedź na moje pytanie, co skutkuje prawidłowym colorbar vs rozstawie poletko. Zauważ, że jeśli odstęp między subplotem a kolorowym paskiem nie ma znaczenia, odpowiedź Molly jest poprawna.

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

Wynika to z:

enter image description here

10

colorbar przyjmuje argument ax "grupa (y) osie macierzyste obiekt, od którego przestrzeń dla nowej osi colorbar zostaną skradzione." W swoim kodzie możesz zrobić coś takiego, aby dodać pasek kolorów obok osi:

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

To jest trochę bardziej eleganckie niż rozwiązanie, które znalazłem. Jednak odstęp między subplotem a kolorowym paskiem jest dość duży. Jakieś pomysły? –

+0

Wypróbuj plt.tight_layout() – Molly

0

Odpowiedź mężczyzny jest wspaniała. Wolałbym jednak unikać kopiowania i wklejania, używając:

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

Wynik jest taki sam.

+0

Możliwe jest również utworzenie niestandardowej liczby działek, po prostu tworząc listę testową dla danej liczby działek. –

Powiązane problemy