matplotlib 中纵横比相等的图形坐标不一致

2023-12-02

我正在准备一张带有从一个到另一个的子图和箭头的图,此处已解决:在 Matplotlib 中绘制两个图之间的线

在我的图中,子图都具有相同的纵横比,这似乎扰乱了从数据坐标到图形坐标的转换,因此我创建的 Line2D 对象没有到达我想要的位置。

这是一个简单的示例(从上面的链接修改),它演示了问题,甚至不需要子图:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(6,4))
ax = fig.add_subplot(111)
ax.set_aspect('equal')

x = [0.2, 0.9]
y = [0.3, 0.7]

ax.plot(x,y,'k--', lw=4)

transFigure = fig.transFigure.inverted()

coord1 = transFigure.transform(ax.transData.transform([x[0],y[0]]))
coord2 = transFigure.transform(ax.transData.transform([x[1],y[1]]))

line = matplotlib.lines.Line2D((coord1[0],coord2[0]),(coord1[1],coord2[1]),
                           transform=fig.transFigure)

fig.lines.append(line)

plt.show()

通过更改图形的尺寸,很容易看到 Line2D 对象改变了斜率,而轴上的图保持其斜率(根据相等纵横比的需要)。

是否有一种直接的方法来获取这些图形坐标(或使用不同的转换),以使 Line2D 对象与绘制的线保持一致?


问题是,当将方面设置为等于轴的尺寸和位置时,只有在画布上绘制某些内容后,才能由 matplotlib 确定。在绘制数据之前,它无法知道轴在最终图形中的位置。使用更极端的点,例如x = [0.2, 0.9]; y = [0.55, 0.6]让这一点更清楚。

enter image description here

最简单的解决方案是调用

fig.canvas.draw()

就在之后plot command但在进行任何转换工作之前。通过这种方式,图形被绘制到画布上,应用相同的方面;从此时起,就可以进行正确的转换了。

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matplotlib 中纵横比相等的图形坐标不一致 的相关文章

随机推荐