axes_grid1 工具包#
axes_grid1 提供了以下功能:
辅助类(ImageGrid、RGBAxes、AxesDivider)用于简化显示具有固定宽高比的图像的轴布局,同时满足额外的约束条件(匹配颜色条和图像的高度,或固定图像之间的填充);
ParasiteAxes_(类似twinx/twiny的功能,以便您可以在同一个Axes中绘制不同的数据(例如,不同的y轴刻度));
AnchoredArtists (放置在锚定位置的自定义艺术家,类似于图例)。
axes_grid1#
ImageGrid#
在 Matplotlib 中,轴的位置和大小通常在归一化的图形坐标中指定(0 = 左下,1 = 右上),这使得在图像之间实现固定的(绝对)填充变得困难。可以使用 ImageGrid 来实现这种填充;有关详细的 API 信息,请参阅其文档。
每个轴的位置在绘图时确定(参见 AxesDivider),因此整个网格的大小适合给定的矩形(类似于轴的纵横比)。请注意,在此示例中,即使您更改图形大小,轴之间的填充也是固定的。
同一列中的轴共享其 x 轴,同一行中的轴共享其 y 轴(在
sharex,sharey的意义上)。此外,同一列中的所有轴具有相同的宽度,同一行中的所有轴具有相同的高度。这些宽度和高度按比例缩放至轴的视图限制(xlim 或 ylim)。
下面的示例展示了你可以用 ImageGrid 做什么。
AxesDivider 类#
在幕后,ImageGrid(以及下面描述的RGBAxes)依赖于 AxesDivider,其作用是在绘图时计算轴的位置。
用户通常不需要通过调用 AxesDivider 直接实例化分隔器;相反,可以使用 make_axes_locatable 为 Axes 创建一个分隔器:
ax = subplot(1, 1, 1)
divider = make_axes_locatable(ax)
AxesDivider.append_axes 可以用来在原始轴的指定边(“左”、“右”、“上”、“下”)创建一个新的轴。
颜色条,其高度(或宽度)与主坐标轴同步#
scatter_hist.py 使用 AxesDivider#
这个 带有直方图的散点图 示例可以使用 make_axes_locatable 重写:
axScatter = plt.subplot()
axScatter.scatter(x, y)
axScatter.set_aspect(1.)
# create new axes on the right and on the top of the current axes.
divider = make_axes_locatable(axScatter)
axHistx = divider.append_axes("top", size=1.2, pad=0.1, sharex=axScatter)
axHisty = divider.append_axes("right", size=1.2, pad=0.1, sharey=axScatter)
# the scatter plot:
# histograms
bins = np.arange(-lim, lim + binwidth, binwidth)
axHistx.hist(x, bins=bins)
axHisty.hist(y, bins=bins, orientation='horizontal')
请参见下面的完整源代码。
使用 AxesDivider 的 使用可定位的轴将直方图与散点图对齐 在某些方面优于 Matplotlib 中的原始 带有直方图的散点图。例如,即使 x 轴或 y 轴是共享的,您也可以设置散点图的纵横比。
ParasiteAxes#
ParasiteAxes 是一个位置与其宿主轴完全相同的轴。位置在绘图时进行调整,因此即使宿主改变其位置(例如,图像),它也能正常工作。
在大多数情况下,您首先创建一个宿主轴,它提供了一些可以用来创建寄生轴的方法。它们是 twinx、twiny``(类似于 matplotlib 中的 ``twinx 和 twiny)和 twin。twin 接受一个任意变换,该变换在宿主轴和寄生轴的数据坐标之间进行映射。寄生轴的 draw 方法永远不会被调用。相反,宿主轴收集寄生轴中的艺术家,并将它们绘制为好像它们属于宿主轴,即,寄生轴中的艺术家被合并到宿主轴中,然后根据它们的 zorder 进行绘制。宿主轴和寄生轴修改了一些轴行为。例如,绘图线的颜色循环在宿主和寄生之间共享。此外,宿主中的图例命令创建一个包含寄生轴中线条的图例。要创建宿主轴,您可以使用 host_subplot 或 host_axes 命令。
示例 1: twinx#
示例 2:双胞胎#
twin 在没有 transform 参数的情况下,假设寄生轴与宿主轴具有相同的数据变换。当你希望顶部(或右侧)轴具有与底部(或左侧)轴不同的刻度位置、刻度标签或刻度格式化器时,这非常有用。:
ax2 = ax.twin() # now, ax2 is responsible for "top" axis and "right" axis
ax2.set_xticks([0., .5*np.pi, np.pi, 1.5*np.pi, 2*np.pi],
labels=["0", r"$\frac{1}{2}\pi$",
r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"])
一个更复杂的示例使用了twin。请注意,如果你在主坐标轴中更改了x轴的限制,寄生坐标轴的x轴限制也会相应地改变。
AnchoredArtists#
axes_grid1.anchored_artists 是一组艺术家的集合,其位置锚定在(轴)边界框上,类似于图例。这些艺术家源自 offsetbox.OffsetBox,并且需要在画布坐标中绘制艺术家。对任意变换的支持有限。例如,下面示例中的椭圆将在数据坐标中具有宽度和高度。
InsetLocator#
参见
axes_grid1.inset_locator 提供了辅助类和函数,用于将嵌入轴放置在父轴的锚定位置,类似于 AnchoredArtist。
inset_locator.inset_axes 创建一个内嵌坐标轴,其大小可以是固定的,或者是父坐标轴的固定比例:
inset_axes = inset_axes(parent_axes,
width="30%", # width = 30% of parent_bbox
height=1., # height = 1 inch
loc='lower left')
创建一个嵌入式轴,其宽度为父轴的30%,高度固定为1英寸。
inset_locator.zoomed_inset_axes 创建一个嵌入轴,其数据比例是父轴的比例乘以某个因子,例如
inset_axes = zoomed_inset_axes(ax,
0.5, # zoom = 0.5
loc='upper right')
创建一个数据比例为父坐标轴一半的内嵌坐标轴。这在父坐标轴上标记放大的区域时非常有用:
inset_locator.mark_inset 允许标记由插入轴表示的区域的位置:
RGBAxes#
RGBAxes 是一个辅助类,用于方便地显示 RGB 复合图像。与 ImageGrid 类似,轴的位置会进行调整,以便它们占据的区域适合给定的矩形。此外,每个轴的 x 轴和 y 轴是共享的。:
from mpl_toolkits.axes_grid1.axes_rgb import RGBAxes
fig = plt.figure()
ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8], pad=0.0)
r, g, b = get_rgb() # r, g, b are 2D images.
ax.imshow_rgb(r, g, b)
AxesDivider#
The mpl_toolkits.axes_grid1.axes_divider 模块提供了辅助类,用于在绘图时调整一组图像的轴位置。
axes_size提供了一类用于确定每个轴大小的单位类。例如,您可以指定一个固定大小。Divider是计算轴位置的类。它将给定的矩形区域划分为几个区域。分隔器通过设置水平和垂直尺寸的列表来初始化,这些尺寸将作为划分的基础。然后使用new_locator(),它返回一个可调用对象,可用于设置轴的 axes_locator。
在这里,我们演示如何实现以下布局:我们希望在3x4的网格中定位轴(注意,Divider 使得行索引从网格的 底部 开始):
┌────────┬────────┬────────┬────────┐
│ (2, 0) │ (2, 1) │ (2, 2) │ (2, 3) │
├────────┼────────┼────────┼────────┤
│ (1, 0) │ (1, 1) │ (1, 2) │ (1, 3) │
├────────┼────────┼────────┼────────┤
│ (0, 0) │ (0, 1) │ (0, 2) │ (0, 3) │
└────────┴────────┴────────┴────────┘
使得底部行的高度固定为2(英寸),而顶部两行的高度比为2(中间)到3(顶部)。(例如,如果网格的大小为7英寸,底部行将是2英寸,中间行也是2英寸,顶部行3英寸。)
这些约束是使用 axes_size 模块中的类指定的,即:
from mpl_toolkits.axes_grid1.axes_size import Fixed, Scaled
vert = [Fixed(2), Scaled(2), Scaled(3)]
(更一般地,axes_size 类定义了一个 get_size(renderer) 方法,该方法返回一对浮点数——一个相对大小和一个绝对大小。 Fixed(2).get_size(renderer) 返回 (0, 2); Scaled(2).get_size(renderer) 返回 (2, 0)。)
我们使用这些约束来初始化一个 Divider 对象:
rect = [0.2, 0.2, 0.6, 0.6] # Position of the grid in the figure.
vert = [Fixed(2), Scaled(2), Scaled(3)] # As above.
horiz = [...] # Some other horizontal constraints.
divider = Divider(fig, rect, horiz, vert)
然后使用 Divider.new_locator 为给定的网格条目创建一个可调用的轴定位器:
locator = divider.new_locator(nx=0, ny=1) # Grid entry (1, 0).
并使其负责定位轴:
ax.set_axes_locator(locator)
轴定位可调用对象返回位于第一列和第二行的单元格的位置和大小。
跨多个单元格的定位器可以通过以下方式创建,例如:
# Columns #0 and #1 ("0-2 range"), row #1.
locator = divider.new_locator(nx=0, nx1=2, ny=1)
请看示例,
您还可以根据每个轴的 x 或 y 数据限制(AxesX 和 AxesY)调整其大小。