注意
转到末尾下载完整示例代码。
坐标轴框纵横比#
此演示显示如何通过 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()
正方形双坐标轴#
生成一个正方形坐标轴,带有双坐标轴。双坐标轴继承父坐标轴的框纵横比。
fig3, ax = plt.subplots()
ax2 = ax.twinx()
ax.plot([0, 10])
ax2.plot([12, 10])
ax.set_box_aspect(1)
plt.show()
图像旁边的普通图#
当创建一个具有固定数据纵横比和默认 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()
正方形联合/边缘图#
可能需要在联合数据的图旁边显示边缘分布。以下内容创建一个正方形图,其中边缘坐标轴的框纵横比等于 gridspec 的宽度和高度比。这确保了所有坐标轴完美对齐,独立于图形的大小。
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()
使用框纵横比设置数据纵横比#
设置框纵横比时,仍然可以同时设置数据纵横比。在这里,我们创建一个框长度是其高度两倍的坐标轴,并为其内容使用“相等”的数据纵横比,即圆实际上保持圆形。
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()
多个子图的框纵横比#
可以在初始化时将框纵横比传递给坐标轴。以下内容创建一个 2 x 3 子图网格,其中所有坐标轴均为正方形。
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()
脚本的总运行时间:(0 分钟 5.237 秒)