2013-05-17 18 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

「審美」 不同的是,因爲我的默認配置項;我缺省設置了'interpolation ='nearest'''。 – keflavich

+0

這種通用的方法似乎可行,但如果有一種方法可以自動生成寬度/高度/垂直/水平位置,而不是將其硬編碼,那將會更好。 – keflavich

相關問題