set_aspect()和坐标转换在matplotlib中

时间:2015-03-17 03:31:21

标签: python matplotlib

在尝试在子图之间绘制一条线时,我遇到matplotlib(版本1.4.3)/ pyplot中的一个错误:在设置set_aspect("equal")之后,它出现了相关的坐标转换函数({ {1}})不要更新。执行下面的代码并取消注释transData以查看差异。

ax.set_aspect("equal")

相关图片在这里(1)和此处(2)。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是在绘制操作之后才会应用set_aspect。因此,当您制作线时,限制没有改变。请注意第二张图像中的不同x限制,而线条位于同一位置:绘制线条就好像x限制没有改变一样,因为它们尚未更改,并且在{}之前不会更改{1}}。解决此问题的方法是在执行plt.show()后添加plt.draw(),但在开始处理转换之前。以下代码执行此操作,使用print语句可以在不同时间清除限制和转换的问题:

set_aspect

这一点应该真正添加到set_aspect的docstring中,我会看看能不能这样做。这不是一个错误:直到情节准备好后才能确定方面。

答案 1 :(得分:0)

cge对为什么的评估是正确的,但对我来说,他的代码产生了:graph1

x限制越来越混乱,因为它们应该匹配y限制相等。

要解决此问题,您可以使用figsize关键字参数将图形大小调整为更合适的子图。在下面的代码中,我选择了10in x 5in。

import matplotlib.pyplot as plt
import matplotlib as mpl

f, (ax1, ax2) = plt.subplots(1, 2, sharey='all', sharex='all', figsize=(10,5))

for ax in (ax1, ax2):
    ax.set_aspect("equal")
    ax.set_ylim([-.2, 1.2])
    ax.set_xlim([-.2, 1.2])

plt.draw()


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

这会产生: enter image description here