坐标轴盒纵横比#

此示例演示了如何通过 set_box_aspect 直接设置坐标轴盒的纵横比。盒纵横比是坐标轴在物理单位中高度与宽度的比值,与数据范围无关。这在例如生成一个方形图(独立于其包含的数据),或者在固定(数据)纵横比的图像图旁边放置一个具有相同坐标轴尺寸的普通图时非常有用。

以下列出了 set_box_aspect 的几个用例。

一个正方形坐标轴,独立于数据#

生成一个正方形坐标轴,无论数据范围如何。

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

共享的正方形坐标轴#

生成尺寸为正方形的共享子图。

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

正方形的孪生坐标轴#

生成一个带孪生坐标轴的正方形坐标轴。孪生坐标轴会继承其父级坐标轴的盒纵横比。

axes box aspect

图像旁边的普通图#

在固定数据纵横比并使用默认 adjustable="box" 创建图像图旁边放置普通图时,坐标轴的高度会不相等。set_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

正方形联合/边际图#

可能需要在一个联合数据的图旁边显示边际分布。以下创建一个正方形图,其中边际坐标轴的盒纵横比等于网格规范的宽度和高度比。这确保了所有坐标轴完美对齐,与图形尺寸无关。

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

用盒纵横比设置数据纵横比#

在设置盒纵横比时,仍然可以设置数据纵横比。这里我们创建一个盒形是其高度两倍长的坐标轴,并为其内容使用“相等”的数据纵横比,即圆圈实际上保持圆形。

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

多个子图的盒纵横比#

可以在初始化时将盒纵横比传递给坐标轴。以下创建一个 2x3 的子图网格,所有坐标轴均为正方形。

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

参考

本示例展示了以下函数、方法、类和模块的使用

标签:组件:坐标轴 样式:尺寸 级别:初学者

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

由 Sphinx-Gallery 生成的画廊