p外部的Matplotlib自动图例

2024-05-15 05:43:26 发布

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

我试图在Python的matplotlib绘图中使用关键字bbox_to_anchor()

以下是我制作的一个非常基本的情节:

import matplotlib.pyplot as plt
x = [1,2,3]
plt.subplot(211)
plt.plot(x, label="test1")
plt.plot([3,2,1], label="test2")
plt.legend(bbox_to_anchor=(0, -0.15, 1, 0), loc=2, ncol=2, mode="expand", borderaxespad=0)
plt.show()

它基于以下示例: http://matplotlib.org/users/legend_guide.html#plotting-guide-legend

我正在尝试使用bbox_to_anchor()自动将图例放置在绘图外部。在本例中,bbox_to_anchor()列出了4个参数。

在这个特殊的例子中(上面),图例被放置在绘图下面,因此每次绘图更改时都需要手动输入数字-0.15(字体大小、删除轴标题等)。 是否可以在以下情况下自动计算这4个数字?

  1. 图下图例
  2. 图上图例
  3. 情节右侧图例

如果不是,是否可以用Python对这些数字做出正确的猜测?

另外,在上面的示例代码中,我将bbox_to_anchor()中的最后两个数字设置为1和0,因为我不知道它们是什么,也不知道它们是如何工作的。最后两个数字是什么意思?


Tags: to绘图示例plotmatplotlibplt数字关键字
2条回答

bbox_to_锚点的参数在轴坐标中。matplotlib使用不同的坐标系来简化对象在屏幕上的放置。在处理定位图例时,要处理的关键坐标系是轴坐标、地物坐标和显示坐标(以像素为单位),如下所示:

matplotlib coordinate systems

如前所述,bbox_to_锚定在轴坐标中,对于矩形不需要所有4个元组参数。您可以简单地给它一个在轴坐标中包含(xpos,ypos)的双参数元组。在本例中,loc参数将定义图例的定位点。因此,若要将图例固定到轴的右外侧并与上边缘对齐,请发出以下命令:

lgd = plt.legend(bbox_to_anchor=(1.01, 1), loc='upper left')

但是,这不会相对于图形重新定位轴,这可能会将图例放置在图形画布之外。为了自动重新定位图形画布以与轴和图例对齐,我使用了以下算法。

首先,在画布上绘制图例以指定其实际像素坐标:

plt.gcf().canvas.draw()

然后定义从像素坐标到图形坐标的转换:

invFigure = plt.gcf().transFigure.inverted()

接下来,以像素为单位获取图例范围并转换为地物坐标。在x方向拉出最远的范围,因为这是我们需要调整的画布方向:

lgd_pos = lgd.get_window_extent()
lgd_coord = invFigure.transform(lgd_pos)
lgd_xmax = lgd_coord[1, 0]

对轴执行同样的操作:

ax_pos = plt.gca().get_window_extent()
ax_coord = invFigure.transform(ax_pos)
ax_xmax = ax_coord[1, 0]

最后,使用tight_布局调整图形画布,以调整必须移动的轴的比例,以便在画布中容纳图例:

shift = 1 - (lgd_xmax - ax_xmax)
plt.gcf().tight_layout(rect=(0, 0, shift, 1))

请注意,tight_layout的rect参数在体形坐标中,它定义了包含轴的tight_layout边界(不包括图例)的矩形的左下角和右上角。因此,一个简单的tight_布局调用相当于设置(0,0,1,1)的rect边界。

编辑:

我强烈建议使用来自ImportanceOfBeingErnest的答案: How to put the legend out of the plot

这个更容易理解:

import matplotlib.pyplot as plt
x = [1,2,3]
plt.subplot(211)
plt.plot(x, label="test1")
plt.plot([3,2,1], label="test2")
plt.legend(bbox_to_anchor=(0, 1), loc='upper left', ncol=1)
plt.show()

现在播放到坐标(x,y)。对于loc,您可以使用:

valid locations are:
right
center left
upper right
lower right
best
center
lower left
center right
upper left
upper center
lower center

相关问题 更多 >

    热门问题