axes_grid1 工具包#

axes_grid1 提供了以下功能:

  • 辅助类 (ImageGrid, RGBAxes, AxesDivider),用于简化显示具有固定纵横比的图像的轴的布局,同时满足其他约束(匹配颜色条和图像的高度,或固定图像之间的填充);

  • ParasiteAxes_(类似 twinx/twiny 的功能,以便您可以在同一 Axes 中绘制不同的数据(例如,不同的 y 轴刻度));

  • AnchoredArtists_(放置在锚定位置的自定义艺术家,类似于图例).

../../../_images/sphx_glr_demo_axes_grid_001.png

axes_grid1#

ImageGrid#

在 Matplotlib 中,轴的位置和大小通常以归一化的图形坐标指定(0 = 左下角,1 = 右上角),这使得很难实现图像之间的固定(绝对)填充. ImageGrid 可用于实现这种填充;有关详细的 API 信息,请参阅其文档.

../../../_images/sphx_glr_simple_axesgrid_001.png
  • 每个轴的位置在绘制时确定(参见 AxesDivider),以便整个网格的大小适合给定的矩形(就像轴的纵横比一样). 请注意,在此示例中,即使您更改图形大小,轴之间的填充也是固定的.

  • 同一列中的轴共享其 x 轴,而同一行中的轴共享其 y 轴(在 sharex , sharey 的意义上). 此外,同一列中的轴都具有相同的宽度,同一行中的轴都具有相同的高度. 这些宽度和高度与轴的视图限制(xlim 或 ylim)成比例缩放.

    ../../../_images/sphx_glr_simple_axesgrid2_001.png

下面的示例展示了您可以使用ImageGrid做什么.

../../../_images/sphx_glr_demo_axes_grid_001.png

AxesDivider类#

在幕后,ImageGrid(以及下面描述的RGBAxes)依赖于 AxesDivider ,它的作用是在绘图时计算坐标轴的位置.

用户通常不需要通过调用 AxesDivider 来直接实例化分割器;相反,可以使用 make_axes_locatable 来为Axes::创建一个分割器:

ax = subplot(1, 1, 1)
divider = make_axes_locatable(ax)

然后可以使用 .AxesDivider.append_axes 在原始轴的给定侧面("左","右","顶部","底部")创建一个新轴.

彩色条,其高度(或宽度)与主轴同步#

../../../_images/sphx_glr_demo_colorbar_with_axes_divider_001.png

带有AxesDivider的scatter_hist.py#

带有直方图的散点图 示例可以使用 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')

请参见下面的完整源代码.

../../../_images/sphx_glr_scatter_hist_locatable_axes_001.png

使用AxesDivider的 使用可定位的 Axes 将直方图与散点图对齐 比Matplotlib中的原始 带有直方图的散点图 具有一些优势. 例如,即使x轴或y轴相应地共享,也可以设置散点图的纵横比.

ParasiteAxes#

ParasiteAxes是一个坐标轴,其位置与其宿主坐标轴相同.该位置在绘图时进行调整,因此即使宿主更改其位置(例如,图像)也可以正常工作.

在大多数情况下,您首先创建一个宿主坐标轴,该坐标轴提供一些可用于创建寄生坐标轴的方法. 它们是 twinx , twiny (类似于matplotlib中的 twinxtwiny )和 twin . twin 采用任意变换,该变换在宿主坐标轴和寄生坐标轴的数据坐标之间进行映射. 寄生轴的 draw 方法永远不会被调用. 相反,宿主坐标轴收集寄生坐标轴中的艺术家,并像它们属于宿主坐标轴一样绘制它们,即,寄生坐标轴中的艺术家被合并到宿主坐标轴中的艺术家,然后根据其zorder绘制. 宿主和寄生坐标轴会修改一些轴的行为. 例如,绘图线的颜色循环在宿主和寄生对象之间共享. 此外,宿主中的图例命令会创建一个包含寄生坐标轴中的线的图例. 要创建宿主坐标轴,可以使用 host_subplothost_axes 命令.

示例1:twinx#

../../../_images/sphx_glr_parasite_simple_001.png

示例2:twin#

没有变换参数的 twin 假定寄生轴与宿主具有相同的数据变换. 当您希望顶部(或右侧)轴具有与底部(或左侧)轴不同的刻度线位置,刻度线标签或刻度线格式化程序时,这很有用.

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$"])
../../../_images/sphx_glr_simple_axisline4_001.png

一个使用twin的更复杂的示例. 请注意,如果更改宿主坐标轴中的x限制,则寄生坐标轴的x限制将相应更改.

../../../_images/sphx_glr_parasite_simple2_001.png

AnchoredArtists#

axes_grid1.anchored_artists 是艺术家的集合,其位置锚定到(轴)bbox,类似于图例. 这些艺术家派生自 offsetbox.OffsetBox ,并且艺术家需要在画布坐标中绘制. 对任意变换的支持有限. 例如,下面示例中的椭圆将具有数据坐标中的宽度和高度.

../../../_images/sphx_glr_simple_anchored_artists_001.png

InsetLocator#

参见

主库中的 Axes.inset_axesAxes.indicate_inset_zoom .

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

创建一个插入轴,其数据比例是父轴的一半. 这对于标记父轴上的缩放区域很有用:

../../../_images/sphx_glr_inset_locator_demo_001.png

inset_locator.mark_inset 允许标记由插入轴表示的区域的位置:

../../../_images/sphx_glr_inset_locator_demo2_001.png

RGBAxes#

RGBAxes是一个辅助类,可以方便地显示RGB复合图像. 像ImageGrid一样,会调整轴的位置,以使它们占据的区域适合给定的矩形. 同样,每个轴的xaxis和yaxis都是共享的.

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)
../../../_images/sphx_glr_demo_axes_rgb_001.png

AxesDivider#

mpl_toolkits.axes_grid1.axes_divider 模块提供了辅助类,用于在绘图时调整一组图像的轴位置.

  • axes_size 提供了一系列单元类,用于确定每个轴的大小.例如,您可以指定一个固定大小.

  • Divider 是计算轴位置的类.它将给定的矩形区域划分为几个区域.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)

参见示例,

../../../_images/sphx_glr_simple_axes_divider1_001.png

您还可以根据其 x 或 y 数据限制(AxesX 和 AxesY)来调整每个轴的大小.

../../../_images/sphx_glr_simple_axes_divider3_001.png