我在matplotlib(version1.4.3
)/pyplot中遇到了一个bug:在设置set_aspect("equal")
之后,相关的坐标转换函数(transData
)似乎没有更新。在未注释ax.set_aspect("equal")
的情况下执行下面的代码以查看差异。在
import matplotlib.pyplot as plt
import matplotlib as mpl
f, (ax1, ax2) = plt.subplots(1, 2, sharey='all', sharex='all')
for ax in (ax1, ax2):
# ax.set_aspect("equal")
ax.set_ylim([-.2, 1.2])
ax.set_xlim([-.2, 1.2])
# From http://stackoverflow.com/questions/17543359/drawing-lines-between-two-plots-in-matplotlib
transFigure = f.transFigure.inverted()
coord1 = transFigure.transform(ax1.transData.transform([0,0]))
coord2 = transFigure.transform(ax2.transData.transform([1,0]))
line = mpl.lines.Line2D((coord1[0],coord2[0]),(coord1[1],coord2[1]),
transform=f.transFigure)
f.lines.append(line)
plt.show()
cge对为什么的评估是正确的,但对我来说,他的代码产生了:
x-极限被混淆了,因为它们应该与y-极限相匹配。在
要解决这个问题,您可以使用子图的
figsize
关键字参数将体形大小调整为更合适的值。在下面的代码中,我选择了10英寸x 5英寸。在这会产生:
您遇到的问题是
set_aspect
直到一个draw操作之后才被应用。因此,当你做这条线的时候,限制并没有改变。请注意第二张图片中的不同x限制,而这条线在同一个位置:绘制这条线时就好像x限制没有更改一样,因为它们还没有更改,而且直到plt.show()
才会更改。解决方法是在您执行set_aspect
之后,但在开始处理转换之前,添加一个plt.draw()
。下面的代码使用print语句来实现这一点,这些语句清楚地说明了不同时间的限制和转换问题:这一点真的应该添加到set_方面的docstring中,我看看我是否可以做到。这不是一个bug:只有在绘图准备就绪之后,才能真正确定方面。在
相关问题 更多 >
编程相关推荐