<p>bbox_to_锚点的参数在轴坐标中。matplotlib使用不同的坐标系来简化对象在屏幕上的放置。在处理定位图例时,要处理的关键坐标系是轴坐标、地物坐标和显示坐标(以像素为单位),如下所示:</p>
<p><a href="https://i.stack.imgur.com/mWZLw.png" rel="nofollow noreferrer">matplotlib coordinate systems</a></p>
<p>如前所述,bbox_to_锚定在轴坐标中,对于矩形不需要所有4个元组参数。您可以简单地给它一个在轴坐标中包含(xpos,ypos)的双参数元组。在本例中,loc参数将定义图例的定位点。因此,若要将图例固定到轴的右外侧并与上边缘对齐,请发出以下命令:</p>
<pre><code>lgd = plt.legend(bbox_to_anchor=(1.01, 1), loc='upper left')
</code></pre>
<p>但是,这不会相对于图形重新定位轴,这可能会将图例放置在图形画布之外。为了自动重新定位图形画布以与轴和图例对齐,我使用了以下算法。</p>
<p>首先,在画布上绘制图例以指定其实际像素坐标:</p>
<pre><code>plt.gcf().canvas.draw()
</code></pre>
<p>然后定义从像素坐标到图形坐标的转换:</p>
<pre><code>invFigure = plt.gcf().transFigure.inverted()
</code></pre>
<p>接下来,以像素为单位获取图例范围并转换为地物坐标。在x方向拉出最远的范围,因为这是我们需要调整的画布方向:</p>
<pre><code>lgd_pos = lgd.get_window_extent()
lgd_coord = invFigure.transform(lgd_pos)
lgd_xmax = lgd_coord[1, 0]
</code></pre>
<p>对轴执行同样的操作:</p>
<pre><code>ax_pos = plt.gca().get_window_extent()
ax_coord = invFigure.transform(ax_pos)
ax_xmax = ax_coord[1, 0]
</code></pre>
<p>最后,使用tight_布局调整图形画布,以调整必须移动的轴的比例,以便在画布中容纳图例:</p>
<pre><code>shift = 1 - (lgd_xmax - ax_xmax)
plt.gcf().tight_layout(rect=(0, 0, shift, 1))
</code></pre>
<p>请注意,tight_layout的rect参数在体形坐标中,它定义了包含轴的tight_layout边界(不包括图例)的矩形的左下角和右上角。因此,一个简单的tight_布局调用相当于设置(0,0,1,1)的rect边界。</p>