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)

与身材矮小的父母的形象

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

4

1 回答 1

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

在此处输入图像描述

于 2013-12-21T19:01:16.087 回答