为什么matplotlib ax.transData.transform在不同的ipython单元格中给出不同的值?如何



我在ipython中遇到了一个非常奇怪的matplotlib的ax.transData.transform问题。基本上,在声明fig, ax = plt.subplots()的单元格中,为xy轴运行ax.transData.transform是不正确的。但是,如果在以后的单元格中运行ax.transData.transform,它将返回正确的值。

为了演示,下面是在声明fig, ax = plt.subplots()的单元格中运行转换的代码:

fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.set_ylim(-2,2)
ax.set_xlim(-5,5)
nsize=[x*100 for x in d]
yradius = (ax.transData.transform([(0,2)]) - ax.transData.transform([(0,1)]))[0,1]
print("yRadius: {}".format(yradius))
xradius = (ax.transData.transform([(2,0)]) - ax.transData.transform([(1,0)]))[0,0]
print("xRadius: {}".format(xradius))

打印输出为

yRadius: 54.360000000000014
xRadius: 33.48000000000002

在上面单元格下面的单元格中,如果我运行

yradius = (ax.transData.transform([(0,2)]) - ax.transData.transform([(0,1)]))[0,1]
print("yRadius: {}".format(yradius))
xradius = (ax.transData.transform([(2,0)]) - ax.transData.transform([(1,0)]))[0,0]
print("xRadius: {}".format(xradius))

输出为

yRadius: 33.48000000000002
xRadius: 33.48000000000002

为什么这两个单元格的值不一样?虽然第一个单元格的xRadius与底部单元格的值匹配,但yRadius是关闭的。我认为底部单元格的数值是正确的,因为由于ax纵横比设置为相等,所以两个半径应该相同。为什么第一个细胞的yRadius在这里是错误的?在尝试了xlimylim的一系列不同值后,我发现第一个单元格中两个半径的最小值是正确的,而另一个是错误的。这在我看来是一个非常奇怪的错误。有没有办法让它在初始单元格中返回正确的值?

您的观察非常准确。所发生的只是,只有在绘制图形后才应用相等的方面。第二个单元格就是这种情况(因为该图显示为第一个单元格的输出(。然而,在第一个单元格中,轴仍然具有其原始范围。

解决方案:在尝试从中获取任何坐标之前绘制图形,

fig.canvas.draw()
# Now obtain coordinates:
yradius = (ax.transData.transform([(0,2)]) - ax.transData.transform([(0,1)]))[0,1]
print("yRadius: {}".format(yradius))
xradius = (ax.transData.transform([(2,0)]) - ax.transData.transform([(1,0)]))[0,0]
print("xRadius: {}".format(xradius))

最新更新