matplotlib.pyplot,保持图形纵横比的方式

61

假设我们有一个多边形的坐标列表,如 polygon = [(x1, y1), (x2, y2), ...],下面的代码将显示该多边形:

import matplotlib.pyplot as plt
plt.fill(*zip(*polygon))
plt.show()
默认情况下,它会尝试调整纵横比以使多边形(或其他图表)适合窗口,并在调整大小后自动更改大小以适应窗口。在许多情况下这很好用,但是当您尝试通过肉眼估计图像是否失真时不适用。如何将纵横比固定为严格的1:1?(我不确定“纵横比”在这里是否是正确的术语,所以如果不是,请注意我需要X轴和Y轴都具有1:1比例,以便在屏幕上X和Y轴上的(0, 1)占用相同数量的屏幕空间。无论如何调整窗口大小,我都需要保持它是1:1的。)

可能是如何在Python matplotlib中使x轴和y轴的刻度相等?的重复问题。 - Trevor Boyd Smith
1
这个问题是在2010年5月29日提出的,可能是一个重复于2013年8月1日提出的问题,而不是反过来。它可能已经有了一个答案(现在已经成为过去)。Wtf, rly... - Headcrab
4个回答

105

使用这个有帮助吗:

plt.axis('equal')

12
你可以使用plt.axis('scaled')。意思是可以调用该函数来实现坐标轴等比例缩放的效果。 - Saullo G. P. Castro
我不明白为什么,但与 scaled 设置相反的是,当我在 axis('equal') 之后改变 ylimxlim 后,刻度尺寸变得不均等,甚至我的散点图中的一些数据被裁剪掉了... - Tomasz Gandor
1
使用 plt.axis('scaled') 和 plt.axis('equal') 有什么区别? - Ernesto Ruiz
默认情况下,似乎 plt.axis('equal') 会调整轴的垂直高度,以实现沿X和Y轴的等比例缩放。是否可能让matplotlib调整水平大小呢? - Sia

37

使用plt缩放

最好的方法是使用:

 plt.axis('scaled')

作为Saullo Castro所说,因为使用Equal时,你不能改变一个轴限制而不改变另一个轴,因此如果你想适应所有非正方形图形,你将会有很多空白空间。

Equal

enter image description here

缩放

enter image description here

使用ax的“equal”

或者,您可以使用axes类

fig = plt.figure()
ax = figure.add_subplot(111)
ax.imshow(image)
ax.axes.set_aspect('equal')

1
这正是我在寻找的。我认为这个答案绝对值得更多的赞同。 - Prasad Raghavendra

19

我相信有一种方法可以直接在绘图命令中设置它,但我不记得这个技巧了。如果要在此之后进行设置,您可以使用当前轴并使用"set_aspect('equal')"设置其纵横比。在您的示例中:

import matplotlib.pyplot as plt
plt.fill(*zip(*polygon))
plt.axes().set_aspect('equal', 'datalim')
plt.show()

我经常使用这个,它来自matplotlib网站上的示例。


2
尝试使用 pylab.gca().set_aspect('equal', 'box')。'box'将调整两个轴限制(例如等高线图中没有空白)。'datalim'仅调整一个限制(只有x或y轴上的空白消失)。还有用于共享轴的异国情调的'box-forced'选项。 - Juha

1
更好的 plt.axis('scaling'),如果你想使用 xlim()ylim() 来修改坐标轴,则更有效。

我认为它应该是说“scaled”。其他答案中已经提到了这一点。 - Tomasz Gandor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接