为什么 matplotlib ax.transData.transform 在不同的 ipython 单元格中给出不同的值?如何解决这个问题?
Why does matplotlib ax.transData.transform gives different values in different ipython cells? How to fix this?
我在 ipython 中遇到了 matplotlib 的 ax.transData.transform
的一个非常奇怪的问题。基本上,在声明 fig, ax = plt.subplots()
的单元格中,x
或 y
轴的 运行ning ax.transData.transform
是不正确的。但是,如果您在后面的单元格中 运行 ax.transData.transform
,它 return 就是正确的值。
为了演示,这里是代码 运行 在声明 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
错了?在为 xlim
和 ylim
尝试了一堆不同的值后,我发现第一个单元格中两个半径的最小值是正确的,而另一个是关闭的。在我看来,这是一个非常奇怪的错误。有什么方法可以使 return 成为初始单元格中的正确值吗?
你的观察很准确。发生的事情很简单,只有在绘制图形后才应用相等的方面。第二个单元格就是这种情况(因为该图显示为第一个单元格的输出)。然而,在第一个单元格中,轴仍然具有其原始范围。
解决方法:在尝试从中获取任何坐标之前绘制图形,
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))
我在 ipython 中遇到了 matplotlib 的 ax.transData.transform
的一个非常奇怪的问题。基本上,在声明 fig, ax = plt.subplots()
的单元格中,x
或 y
轴的 运行ning ax.transData.transform
是不正确的。但是,如果您在后面的单元格中 运行 ax.transData.transform
,它 return 就是正确的值。
为了演示,这里是代码 运行 在声明 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
错了?在为 xlim
和 ylim
尝试了一堆不同的值后,我发现第一个单元格中两个半径的最小值是正确的,而另一个是关闭的。在我看来,这是一个非常奇怪的错误。有什么方法可以使 return 成为初始单元格中的正确值吗?
你的观察很准确。发生的事情很简单,只有在绘制图形后才应用相等的方面。第二个单元格就是这种情况(因为该图显示为第一个单元格的输出)。然而,在第一个单元格中,轴仍然具有其原始范围。
解决方法:在尝试从中获取任何坐标之前绘制图形,
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))