Matplotlib刻度轴长度相等

时间:2018-04-27 07:37:32

标签: python python-3.x matplotlib

我有2个子图:

dataType: 'json'

两者的plt.subplot(1, 2, 1) plt.plot(x, y) plt.subplot(1, 2, 2) plt.plot(u, v) u范围均为[0,1],vx的范围是随机的,yx不同。我想将两个子图形平方,因此x轴的长度应该等于y轴的长度。对于第二个子图,很容易使用另一个SO问题:

y

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

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

2 个答案:

答案 0 :(得分:2)

你想要你的子图是平方的。函数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')

enter image description here

不幸的是,这会将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())

enter image description here

答案 1 :(得分:1)

由于您需要等轴,因此应设置plt.axis('equal')而不是'scaled'。实际上,即使对于第二种情况,也应该使用'equal'关键字来给出正方形数字

x = np.linspace(1, 0.1, 10)
y = np.linspace(1, 1, 10)
fig, ax = plt.subplots(figsize=(5, 5))
ax.plot(x, y, '.')
ax.axis('equal')
plt.show()

Square plot with equal aspect ratio

请注意,将figsize设置为(length, length)会给出实际的平方,否则会占用默认的数字大小。