笔记
单击此处 下载完整的示例代码
#概述mpl_toolkits.axes_grid1
axes_grid1
提供以下功能:
辅助类(ImageGrid、RGBAxes、AxesDivider)以简化显示具有固定纵横比的图像的轴的布局,同时满足额外的约束(匹配颜色条和图像的高度,或修复图像之间的填充);
ParasiteAxes(类似双胞胎/双胞胎的功能,以便您可以在同一轴上绘制不同的数据(例如,不同的 y 尺度));
AnchoredArtists(放置在锚定位置的自定义艺术家,类似于图例)。
轴网格1 #
图像网格#
在 Matplotlib 中,轴的位置和大小通常在标准化图形坐标中指定(0 = 左下角,1 = 右上角),这使得很难在图像之间实现固定(绝对)填充。
ImageGrid
可以用来实现这样的填充;有关详细的 API 信息,请参阅其文档。
每个轴的位置在绘图时确定(请参阅 AxesDivider),以便整个网格的大小适合给定的矩形(如轴的方面)。请注意,在此示例中,即使您更改图形大小,轴之间的填充也是固定的。
同一列中的轴共享它们的 x 轴,并且同一行中的轴共享它们的 y 轴(在 , 的意义上
sharex
)sharey
。此外,同一列中的轴都具有相同的宽度,并且同一行中的轴都具有相同的高度。这些宽度和高度与轴的视图限制(xlim 或 ylim)成比例。
下面的示例显示了您可以使用 ImageGrid 做什么。
AxesDivider 类#
在幕后,ImageGrid(和 RGBAxes,如下所述)依赖于
AxesDivider
,其作用是在绘制时计算坐标轴的位置。
用户通常不需要通过调用直接实例化分隔符AxesDivider
;相反,
make_axes_locatable
可用于为轴创建分隔线:
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 是一个坐标轴,其位置与其宿主坐标轴相同。该位置在绘图时调整,因此即使主机更改其位置(例如,图像)也可以工作。
在大多数情况下,您首先创建一个宿主轴,它提供了一些可用于创建寄生轴的方法。它们是twinx
,
twiny
(类似于matplotlibtwinx
并twiny
在 matplotlib 中)和
twin
. twin
采用在宿主轴和寄生轴的数据坐标之间映射的任意变换。这draw
永远不会调用寄生虫轴的方法。相反,宿主轴收集寄生轴中的艺术家并将它们绘制成好像它们属于宿主轴一样,即寄生轴中的艺术家与宿主轴的艺术家合并,然后根据它们的 zorder 进行绘制。宿主轴和寄生虫轴会修改某些轴的行为。例如,绘图线的颜色循环在宿主和寄生虫之间共享。此外,主机中的 legend 命令会创建一个图例,其中包括寄生虫轴中的线条。要创建主机轴,您可以使用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$"])
使用双胞胎的更复杂的示例。请注意,如果您更改宿主轴中的 x 限制,则寄生轴的 x 限制将相应更改。
锚定艺术家#
axes_grid1.anchored_artists
是一组艺术家,其位置锚定到(轴)bbox,类似于图例。这些艺术家来源于offsetbox.OffsetBox
,并且艺术家需要在画布坐标中绘制。对任意转换的支持有限。例如,下面示例中的椭圆将在数据坐标中具有宽度和高度。
插入定位器#
也可以看看
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
允许标记由插入轴表示的区域的位置:
RGB轴#
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)
分轴器#
该mpl_toolkits.axes_grid1.axes_divider
模块提供了帮助类来在绘图时调整一组图像的轴位置。
axes_size
提供了一类单位,用于确定每个轴的大小。例如,您可以指定固定大小。Divider
是计算坐标轴位置的类。它将给定的矩形区域划分为几个区域。通过设置划分所基于的水平和垂直大小列表来初始化分隔符。然后 usenew_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)
返回一对浮点数的方法——一个相对大小和一个绝对大小。returns ;
Fixed(2).get_size(renderer)
returns 。)(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
创建一个AxesLocator
实例:
locator = divider.new_locator(nx=0, ny=1) # Grid entry (1, 0).
并使其负责定位轴:
ax.set_axes_locator(locator)
这AxesLocator
是一个可调用对象,它返回第一列和第二行单元格的位置和大小。
可以创建跨越多个单元格的定位器,例如:
# Columns #0 and #1 ("0-2 range"), row #1.
locator = divider.new_locator(nx=0, nx1=2, ny=1)
看例子,
您还可以根据其 x 或 y 数据限制(AxesX 和 AxesY)调整每个轴的大小。