如何确保绘图的x轴和y轴大小相等?

3
我希望将 xy 轴的长度设置为相等(即绘图减去图例的部分应该是正方形)。我希望把图例绘制在外部(我已经能够让图例位于图框外部)。数据中x轴的跨度(x_max - x_min)与y轴的跨度(y_max - y_min)不同。
这是我现有的代码中相关的部分:
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15 )
plt.axis('equal')
plt.tight_layout()

以下链接是我得到的一个输出图形示例:plot 我该如何做到这一点?
2个回答

6

你是否需要使用plt.axis('scaled')命令?如果数据的极限差异相等,那么这将产生一个正方形图。

如果它们不是相等的,你可以通过将轴的纵横比设置为xlimits和ylimits的比率来获得正方形的图。

import numpy as np
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1,2)

ax1.plot([-2.5, 2.5], [-4,13], "s-")
ax1.axis("scaled")

ax2.plot([-2.5, 2.5], [-4,13], "s-")
ax2.set_aspect(np.diff(ax2.get_xlim())/np.diff(ax2.get_ylim()))

plt.show()

enter image description here


谢谢你的回答。如果图例在图外会有影响吗?我想让没有图例的部分成为一个正方形(我想把图例放在这个正方形的旁边)。在我的情况下,数据限制不是等差的。 - user10853036
这不应该影响程序的运行,无论是有其他子图还是在图旁边有图例。我建议你试一下,看看结果是否满意,否则请回来解释任何进一步的问题。 - ImportanceOfBeingErnest
谢谢你的回答。我试过了,它有效,但是有一个问题——图的两侧被切掉了(这是我使用plt.tight_layout()时出现的)。在使用上述建议后,这是我得到的图。(https://i.stack.imgur.com/sn6zj.png)如何避免图形的两侧被切掉? - user10853036
不应该发生这种情况。在设置纵横比之前,您是否调用了tight_layout函数? - ImportanceOfBeingErnest
在设置了aspect之后,我调用了tight_layout。我没有子图,所以我尝试了基于您的建议的这种方法。这是我在代码相关部分正在做的事情:第一行: axes = plt.gca()第二行: axes.set_aspect(np.diff(axes.get_xlim())/np.diff(axes.get_ylim()))第三行: plt.tight_layout()第四行: plt.savefig('filename.png') - user10853036
我认为我需要一个可验证的示例([mcve])来找出问题所在。 - ImportanceOfBeingErnest

1

您可以手动设置限制,假设您知道数据集的大小。

axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])

更好的选择是遍历数据以查找最大的x和y坐标,取这两个数字中较大的一个,再加上一些值作为缓冲,将该值设置为xmaxymax。您可以使用类似的方法设置xminymin:而不是找到最大值,找到最小值。
要将图例放在图形外部,我建议参考此问题:如何将图例放在图形外部

我已经成功将图例放在盒子外面了(如图所示)。数据中的x轴跨度(x_max - x_min)与数据中的y轴跨度(y_max - y_min)不同。我想要的是让x轴和y轴长度相等(即绘图减去图例后应该是正方形)。 - user10853036
除非我误解了什么,否则我认为你应该能够做到我上面描述的事情。如果不行,请告诉我。 - nschmeller
Nicholas:谢谢你的帮助,我非常感激。不幸的是,它似乎没有起作用。我尝试了你的建议。这是我尝试的代码:plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=15) axes = plt.gca()xmin = np.min(XX[:, 0]) xmax = np.max(XX[:, 0]) ymin = np.min(XX[:, 1]) ymax = np.max(XX[:, 1])axes.set_xlim([xmin, xmax]) axes.set_ylim([ymin, ymax]) - user10853036

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