Python 在不改变原始轴尺寸的情况下制作分隔器?

Python 在不改变原始轴尺寸的情况下制作分隔器?,python,matplotlib,Python,Matplotlib,Matplotlib的使轴可定位工具允许您将新轴固定到现有轴的侧面。但是,它会调整父轴的大小。有没有办法避免这种情况 下面是一个完整的示例,显示了问题以及如何重现问题: 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.i

Matplotlib的
使轴可定位
工具允许您将新轴固定到现有轴的侧面。但是,它会调整父轴的大小。有没有办法避免这种情况

下面是一个完整的示例,显示了问题以及如何重现问题:

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)


问题是子地块现在大小不同。我认为左边和右边都缩小了,但中间没有变化。

我可以通过修改代码为每个颜色条创建新的轴,然后手动放置每个轴,从而避免调整父绘图的大小。这是一个多一点的工作,但我认为它接近的结果,你正在寻找。请注意,绘图的实际美学外观与您的略有不同——可能是因为我使用的是matplotlib(1.2.1)的最新版本


审美上的差异是因为我的默认配置项;默认情况下,我设置了
interpolation='nearest'
。这种通用方法似乎可行,但如果有一种方法可以自动生成宽度/高度/垂直/水平位置,而不是硬编码,那会更好。
%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')