为什么matplotlib ax.transData.transform在不同的ipython单元格中提供不同的值?如何解决这个问题?

为什么matplotlib ax.transData.transform在不同的ipython单元格中提供不同的值?如何解决这个问题?,matplotlib,ipython,transform,subplot,axes,Matplotlib,Ipython,Transform,Subplot,Axes,在ipython中matplotlib的ax.transData.transform遇到了一个非常奇怪的问题。基本上,在声明了fig,ax=plt.subplot()的单元格中,为x或y轴运行ax.transData.transform是不正确的。但是,如果在以后的单元格中运行ax.transData.transform,它将返回正确的值 为了演示,下面是在单元格中运行转换的代码,其中声明了fig,ax=plt.subplot(): fig, ax = plt.subplots() ax.set

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

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

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: 33.48000000000002
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: 54.360000000000014
xRadius: 33.48000000000002
yRadius: 33.48000000000002
xRadius: 33.48000000000002

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

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

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

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))

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

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

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))