2014-04-24 12 views
5

Próbuję dodać colorbar na działce składający się z dwóch wątków o równych proporcjach, czyli z set_aspect('equal'):Dodawanie colorbar do dwóch wątków o równych proporcjach

enter image description here

kod używany do utwórz ten wykres można znaleźć w this IPython notebook.

Obraz utworzony przy użyciu kodu pokazanego poniżej (and here in the notebook) jest najlepszym wynikiem, jaki mogłem uzyskać, ale nadal nie jest to coś, co chcę.

plt.subplot(1,2,1) 
plt.pcolormesh(rand1) 
plt.gca().set_aspect('equal') 

plt.subplot(1,2,2) 
plt.pcolormesh(rand2) 
plt.gca().set_aspect('equal') 

plt.tight_layout() 

from mpl_toolkits.axes_grid1 import make_axes_locatable 
divider = make_axes_locatable(plt.gca()) 
cax = divider.append_axes("right", size="5%", pad=0.05) 

plt.colorbar(cax=cax) 

enter image description here

To pytanie wydaje się mieć związek:

+0

Jakie jest twoje pytanie? –

+0

Cóż, jest źle wyświetlany :( –

+0

Nie jestem pewien, co chcesz zrobić. Co masz na myśli, mówiąc "Cóż, to jest źle wyświetlane"? –

Odpowiedz

5

ja nadal nie jestem pewien, co dokładnie chcesz, ale myślę, że chcesz do wątków używając pcolormesh mieć ten sam rozmiar podczas dodawania paska kolorów?

To, co mam teraz, to trochę hack, ponieważ dodam colorbar dla obu podpól, aby upewnić się, że mają ten sam rozmiar. Afterwords Usuwam pierwszy colorbar. Jeśli wynik jest taki, jaki chcesz, mogę spojrzeć na bardziej pytonowy sposób jego osiągnięcia. Na razie jest jeszcze trochę niejasno, czego dokładnie chcesz.

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


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

fig = plt.figure() 

ax1 = fig.add_subplot(1,2,1, aspect = "equal") 
ax2 = fig.add_subplot(1,2,2, aspect = "equal") 

im1 = ax1.pcolormesh(data) 
im2 = ax2.pcolormesh(data) 

divider1 = make_axes_locatable(ax1) 
cax1 = divider1.append_axes("right", size="5%", pad=0.05) 

divider2 = make_axes_locatable(ax2) 
cax2 = divider2.append_axes("right", size="5%", pad=0.05) 

#Create and remove the colorbar for the first subplot 
cbar1 = fig.colorbar(im1, cax = cax1) 
fig.delaxes(fig.axes[2]) 

#Create second colorbar 
cbar2 = fig.colorbar(im2, cax = cax2) 

plt.tight_layout() 

plt.show() 

enter image description here

+0

Dziękuję, to było właśnie rozwiązanie mojego problemu. Próbowałem udokumentować moje poprzednie podejście, a także twoje rozwiązanie na http://nbviewer.ipython.org/gist/dawehner/38146566287fb23def4a –

2

Rozwiązanie to jest podobne do tych opisanych powyżej, ale nie wymaga tworzenia i odrzucając colorbar.

Należy zauważyć, że w obu rozwiązaniach występuje potencjalna usterka: pasek koloru użyje barwy i normalizacji jednej z siatek kolorów. Jeśli są one takie same dla obu, nie stanowi to problemu.

ImageGrid class ma coś, co wygląda jak to, co chcesz:

from mpl_toolkits.axes_grid1 import make_axes_locatable 
fig = plt.figure(1, (4., 4.)) 
ax = plt.subplot(1,1,1) 
divider = make_axes_locatable(ax) 

cm = plt.pcolormesh(rand1) 
ax.set_aspect('equal') 

cax = divider.append_axes("right", size="100%", pad=0.4) 
plt.pcolormesh(rand2) 
cax.set_aspect('equal') 

sm = plt.cm.ScalarMappable(cmap=cm.cmap, norm=cm.norm) 
sm._A = [] 

cax = divider.append_axes("right", size="10%", pad=0.1) 
plt.colorbar(sm, cax=cax) 
None # Prevent text output 
+0

I nie zgadzam się co do komentarza dotyczącego potencjalnej usterki, gdy używasz jednego 'colorbar' dla dwóch subplots utworzonych przy użyciu' pcolormesh' lub 'imshow', etc,' vmin' i 'vmax' obu zbiorów danych musi być ntical. W przeciwnym razie nie można nawet użyć jednego paska koloru. W przypadku, gdy 'vmin' i' vmax' różnią się, musisz użyć dwóch 'kolorowych pasków ', które możesz zarówno unormować indywidualnie. –

Powiązane problemy