备注
Go to the end 下载完整的示例代码.
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()

正方形的 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()

普通图旁边是图像#
当创建一个具有固定数据纵横比和默认 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 等于 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()

使用 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()

多个子图的 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()

参考
以下函数,方法,类和模块的用法在本例中显示:
matplotlib.axes.Axes.set_box_aspect
脚本的总运行时间:(0 分 2.533 秒)
