在matplotlib中设置_aspect()和坐标变换

2024-10-01 09:34:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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()

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


Tags: matplotlibtransformpltequalaxlinessetpyplot
2条回答

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

x-极限被混淆了,因为它们应该与y-极限相匹配。在

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

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

您遇到的问题是set_aspect直到一个draw操作之后才被应用。因此,当你做这条线的时候,限制并没有改变。请注意第二张图片中的不同x限制,而这条线在同一个位置:绘制这条线时就好像x限制没有更改一样,因为它们还没有更改,而且直到plt.show()才会更改。解决方法是在您执行set_aspect之后,但在开始处理转换之前,添加一个plt.draw()。下面的代码使用print语句来实现这一点,这些语句清楚地说明了不同时间的限制和转换问题:

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_ylim([-.2, 1.2])
    ax.set_xlim([-0.2, 1.2])  

transFigure = f.transFigure.inverted()

print ax1.get_xlim(), ax1.transData.transform([0,0])

for ax in (ax1, ax2):
    ax.set_aspect('equal')

print ax1.get_xlim(), ax1.transData.transform([0,0])

plt.draw()

print ax1.get_xlim(), ax1.transData.transform([0,0])

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

这一点真的应该添加到set_方面的docstring中,我看看我是否可以做到。这不是一个bug:只有在绘图准备就绪之后,才能真正确定方面。在

相关问题 更多 >