当函数调用嵌套时,我在axis_grid工具箱中遇到make_axes_locatable/append_axes
的问题,例如,
divider1 = make_axes_locatable(ax1)
divider2 = make_axes_locatable(divider1.append_axes(...))
如果我使用上面的代码创建3个轴,如(4,5,6),则主轴(ax4)隐藏在右边的另外两个轴之后(见下图和this gist)。我想make_axes_locatable/append_axes
不应该以这种方式使用。
我想要的只是将颜色条放在ax1的顶部(如下图所示 - this gist),而是放在桌子下面的空白处。 make_axes_locatable
的优点是,如果我调整大小,图形仍然看起来不错,与使用fig.add_axes()
手动创建轴对象(4末尾的代码)相反。
任何人都可以告诉我如何拆分右轴(ax2)s.t.表格下面的所有空格都用于颜色栏及其标签?
答案 0 :(得分:1)
我不确定你只能用AxesDivider.append_axes
来做这件事,因为根据documentation那种方法“在给定位置创建具有相同高度(或宽度)的轴[s]主轴。“您希望右侧的轴具有与左侧不同的高度。
另一种选择是创建两个子图并使用分隔符来分解右边的子图:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
ax = plt.subplot(121)
ax2 = plt.subplot(122)
divider = make_axes_locatable(ax2)
ax3 = divider.append_axes("bottom", size="50%", pad=0.5)
plt.show()
或直接创建Divider
(不使用makes_axes_locatable
),如下所示here及以下内容:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid import Divider
import mpl_toolkits.axes_grid.axes_size as Size
fig1 = plt.figure(1, (5.5, 4.))
# the rect parameter will be ignore as we will set axes_locator
rect = (0.1, 0.1, 0.8, 0.8)
ax = [fig1.add_axes(rect, label="%d"%i) for i in range(3)]
horiz = [Size.Scaled(1.5), Size.Fixed(.5), Size.Scaled(1.),
Size.Scaled(.5)]
vert = [Size.Scaled(1.), Size.Fixed(.5), Size.Scaled(1.5)]
# divide the axes rectangle into grid whose size is specified by horiz * vert
divider = Divider(fig1, rect, horiz, vert, aspect=False)
ax[0].set_axes_locator(divider.new_locator(nx=0, ny=0, ny1=3))
ax[1].set_axes_locator(divider.new_locator(nx=2, ny=2))
ax[2].set_axes_locator(divider.new_locator(nx=2, ny=0))
plt.show()
或者如果根本没有理由使用Divider
,您可以使用GridSpec:
import matplotlib.pyplot as plt
ax1 = plt.subplot2grid((2,2), (0,0), rowspan=2)
ax2 = plt.subplot2grid((2,2), (0, 1))
ax3 = plt.subplot2grid((2,2), (1, 1))
plt.show()
所有这三个选项都会创建一些与此相关的内容:
当我调整它们时,所有这三个看起来都很好,至少用这个简单的例子。
修改强>
您可以使用gridspec
和Subplot
来获得左侧的轴,纵横比为1,右侧的轴与左轴的顶部和底部对齐。诀窍是使用gridspec
和width_ratios
设置height_ratios
的宽高比。调整此图形的大小时,右轴的顶部和底部仍将与左轴的顶部和底部对齐。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure()
# grid spec for left and right columns
gs0 = gridspec.GridSpec(1, 2,width_ratios=[1,1], height_ratios=[1,1])
# gird spec for left axes with aspect ratio of 1
gs00 = gridspec.GridSpecFromSubplotSpec(1, 1, subplot_spec=gs0[0], width_ratios=[1], height_ratios=[1])
ax1 = plt.Subplot(fig, gs00[0])
fig.add_subplot(ax1)
# grid spec for two right axes
gs01 = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=gs0[1])
ax2 = plt.Subplot(fig, gs01[0])
ax3 = plt.Subplot(fig, gs01[1])
fig.add_subplot(ax2)
fig.add_subplot(ax3)
plt.show()