Axes 框体纵横比#

此演示展示了如何直接通过 set_box_aspect 设置 Axes 框体的纵横比.框体纵横比是以物理单位表示的 Axes 高度和 Axes 宽度的比率,与数据限制无关.这对于生成一个正方形图很有用,而与其包含的数据无关,或者使一个普通的图与一个具有固定(数据)纵横比的图像图相邻排列.

以下列出了一些 set_box_aspect 的用例.

一个正方形的 Axes,与数据无关#

生成一个正方形的 Axes,无论数据限制是什么.

import matplotlib.pyplot as plt
import numpy as np

fig1, ax = plt.subplots()

ax.set_xlim(300, 400)
ax.set_box_aspect(1)

plt.show()
axes box aspect

共享的正方形 Axes#

生成大小为正方形的共享子图.

fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)

ax.plot([1, 5], [0, 10])
ax2.plot([100, 500], [10, 15])

ax.set_box_aspect(1)
ax2.set_box_aspect(1)

plt.show()
axes box aspect

正方形的 twin Axes#

生成一个正方形的 Axes,带有一个 twin Axes.twinned Axes 接管父对象的 box aspect.

fig3, ax = plt.subplots()

ax2 = ax.twinx()

ax.plot([0, 10])
ax2.plot([12, 10])

ax.set_box_aspect(1)

plt.show()
axes box aspect

普通图旁边是图像#

当创建一个具有固定数据纵横比和默认 adjustable="box" 的图像图,并在旁边创建一个普通图时,Axes 的高度会不相等. set_box_aspect 提供了一个简单的解决方案,允许普通图的 Axes 使用图像的尺寸作为 box aspect.

此示例还显示了约束布局与固定 box aspect 的良好互动.

fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")

np.random.seed(19680801)  # Fixing random state for reproducibility
im = np.random.rand(16, 27)
ax.imshow(im)

ax2.plot([23, 45])
ax2.set_box_aspect(im.shape[0]/im.shape[1])

plt.show()
axes box aspect

正方形的联合/边缘图#

可能希望在联合数据图旁边显示边缘分布.以下代码创建一个正方形图,其中边缘 Axes 的 box aspect 等于 gridspec 的宽度和高度比.这确保了所有 Axes 完美对齐,与图形的大小无关.

fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
                         gridspec_kw=dict(height_ratios=[1, 3],
                                          width_ratios=[3, 1]))
axs[0, 1].set_visible(False)
axs[0, 0].set_box_aspect(1/3)
axs[1, 0].set_box_aspect(1)
axs[1, 1].set_box_aspect(3/1)

np.random.seed(19680801)  # Fixing random state for reproducibility
x, y = np.random.randn(2, 400) * [[.5], [180]]
axs[1, 0].scatter(x, y)
axs[0, 0].hist(x)
axs[1, 1].hist(y, orientation="horizontal")

plt.show()
axes box aspect

使用 box aspect 设置数据纵横比#

设置 box aspect 时,仍然可以设置数据纵横比.在这里,我们创建一个 box 长度是高度两倍的 Axes,并为其内容使用"equal"数据纵横比,即圆实际上保持圆形.

fig6, ax = plt.subplots()

ax.add_patch(plt.Circle((5, 3), 1))
ax.set_aspect("equal", adjustable="datalim")
ax.set_box_aspect(0.5)
ax.autoscale()

plt.show()
axes box aspect

多个子图的 Box aspect#

可以在初始化时将 box aspect 传递给 Axes.以下代码创建一个 2x3 的子图网格,所有 Axes 都是正方形的.

fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
                         sharex=True, sharey=True, layout="constrained")

for i, ax in enumerate(axs.flat):
    ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
plt.show()
axes box aspect

参考

以下函数,方法,类和模块的用法在本例中显示:

  • matplotlib.axes.Axes.set_box_aspect

Tags: component: axes styling: size level: beginner

脚本的总运行时间:(0 分 2.533 秒)

Gallery generated by Sphinx-Gallery