Matplotlib 缩放轴长度相等

Gáb*_*dős 7 python matplotlib python-3.x

我有 2 个子图:

plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.subplot(1, 2, 2)
plt.plot(u, v)
Run Code Online (Sandbox Code Playgroud)

的范围uv是[0,1]两者,和的范围xy是随机的,并且x是从不同的y。我想让两个子图都平方,所以 x 轴的长度应该等于 y 轴的长度。对于第二个子图,使用另一个 SO 问题很容易:

plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.subplot(1, 2, 2)
plt.plot(u, v)
plt.axis('scaled')
Run Code Online (Sandbox Code Playgroud)

然而,这种方法不适用于第一个子图,它将 y 轴按比例缩小到很小的范围,因为值在一个小范围内,而 x 轴基本上在 [0,1] 范围内,因此它具有相同的缩放比例第二个子情节。

如何将第一个子图的 y 轴缩放为等于其他轴长度?

Sto*_*ica 8

您希望对子图进行平方。该函数plt.axis接受'square'作为参数,它的真正含义是:它将以像素和数据单位对当前轴进行平方。

x = np.arange(2)
y = x / 3
u = v = [0, 1]

plt.subplot(121)
plt.plot(x, y)
plt.axis('square')

plt.subplot(122)
plt.plot(u, v)
plt.axis('square')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

不幸的是,这会将 Y 轴限制扩展到 Y 数据范围之外,这不是您想要的。您需要的是子图的纵横比是数据范围比的倒数。AFAIK 没有任何方便的功能或方法,但您可以编写自己的。

def make_square_axes(ax):
    """Make an axes square in screen units.

    Should be called after plotting.
    """
    ax.set_aspect(1 / ax.get_data_ratio())

plt.subplot(121)
plt.plot(x, y)
make_square_axes(plt.gca())

plt.subplot(122)
plt.plot(u, v)
make_square_axes(plt.gca())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明