2013-05-17 4 views
6

Matplotlibのmake_axes_locatableツールを使用すると、新しい軸を既存の軸の側面にタックすることができます。ただし、親軸のサイズを変更します。これを避ける方法はありますか?以下は元の軸のサイズを変更せずにディバイダを作成しますか?

問題とどのようにそれを再現することを示す完全な例である:

import matplotlib.pyplot as pl 
from mpl_toolkits.axes_grid import make_axes_locatable 
import matplotlib.axes as maxes 


fig = pl.figure() 
ax1=pl.subplot(1,3,1) 
ax1.imshow([[0,1],[2,0]]) 
ax1.yaxis.set_visible(False) 
ax1.xaxis.set_visible(False) 
ax2=pl.subplot(1,3,2) 
ax2.imshow([[0,1],[2,0]]) 
ax2.yaxis.set_visible(False) 
ax2.xaxis.set_visible(False) 
ax3=pl.subplot(1,3,3) 
ax3.imshow([[0,1],[2,0]]) 
ax3.yaxis.set_visible(False) 
ax3.xaxis.set_visible(False) 
pl.subplots_adjust(wspace=0) 


divider = make_axes_locatable(ax1) 
cax1 = divider.new_horizontal(size=0.2, pad=0.0, pack_start=True, axes_class=maxes.Axes) 
pl.colorbar(ax1.images[0],cax=cax1) 
cax1.yaxis.set_label_position('left') 
cax1.yaxis.set_ticks_position('left') 
fig.add_axes(cax1) 

divider = make_axes_locatable(ax2) 
cax2 = divider.new_vertical(size=0.2, pad=0.0, pack_start=True, axes_class=maxes.Axes) 
fig.add_axes(cax2) 
pl.colorbar(ax2.images[0],cax=cax2,orientation='horizontal') 
# thin out the tick labels for visibility 
for t in cax2.xaxis.get_majorticklabels()[::2]: 
    t.set_visible(False) 


divider = make_axes_locatable(ax3) 
cax3 = divider.new_horizontal(size=0.2, pad=0.0, pack_start=False, axes_class=maxes.Axes) 
pl.colorbar(ax3.images[0],cax=cax3) 
fig.add_axes(cax3) 

image with missized parents

問題は、サブプロットは、現在さまざまなサイズであるということです。私は左右が縮んだと思うが、中央は変わらない。

答えて

2

親のプロットのサイズ変更を避けるために、各カラーバーの新しい軸を作成するようにコードを変更してから、それぞれを手動で配置します。それはもう少し仕事ですが、あなたが探している結果に近いと思います。私がmatplotlib(1.2.1)のより新しいバージョンを使用しているために、プロットの実際の美的外観があなたと少し違うことに注意してください。

%pylab inline 
import matplotlib.pyplot as pl 

fig = pl.figure() 
ax1=pl.subplot(1,3,1) 
ax1.imshow([[0,1],[2,0]]) 
ax1.yaxis.set_visible(False) 
ax1.xaxis.set_visible(False) 
ax2=pl.subplot(1,3,2) 
ax2.imshow([[0,1],[2,0]]) 
ax2.yaxis.set_visible(False) 
ax2.xaxis.set_visible(False) 
ax3=pl.subplot(1,3,3) 
ax3.imshow([[0,1],[2,0]]) 
ax3.yaxis.set_visible(False) 
ax3.xaxis.set_visible(False) 
pl.subplots_adjust(wspace=0) 

#Give the colorbar its own axis to avoid resizing the parent axis: 
width = 0.02 
height = 0.38 
vertical_position = 0.32 
horizontal_position = 0.1 
axColor = pl.axes([horizontal_position, vertical_position, width, height]) #the new axis for first colorbar 
pl.colorbar(ax1.images[0],cax=axColor,orientation='vertical') 
axColor.yaxis.set_label_position('left') 
axColor.yaxis.set_ticks_position('left') 

#likewise for the other colorbars with appropriately adjusted positions/ orientations: 
horizontal_position= 0.38 
vertical_position = 0.29 
height = 0.03 
width = 0.26 
axColor2 = pl.axes([horizontal_position, vertical_position, width, height]) #the new axis for second colorbar 
pl.colorbar(ax2.images[0],cax=axColor2,orientation='horizontal') 
# thin out the tick labels for visibility 
for t in axColor2.xaxis.get_majorticklabels()[::2]: 
    t.set_visible(False) 

width = 0.02 
height = 0.38 
vertical_position = 0.32 
horizontal_position = 0.905 
axColor3 = pl.axes([horizontal_position, vertical_position, width, height]) #the new axis for third colorbar  
pl.colorbar(ax3.images[0],cax=axColor3,orientation='vertical') 

enter image description here

+0

「美的」の違いは、私のためにデフォルトの設定項目です。私はデフォルトで '補間= 'nearest'が設定されています。 – keflavich

+0

この一般的なアプローチはうまくいくようですが、ハードコードするのではなく、幅/高さ/垂直/水平の位置を自動的に生成する方法があれば、はるかに良いでしょう。 – keflavich

関連する問題