如何在图形坐标中指定 matplotlib 中的图例位置

新手上路,请多包涵

我知道 bbox_to_anchor 关键字和这个线程,这非常有助于建议如何手动放置图例:

怎么把传说从剧情里去掉

但是,我想使用图中 x 轴和 y 轴的坐标来指定图例位置(图中),因为我可能需要将图形移动到具有不同轴环境的大图形中,而且我不想每次都手动处理这些坐标。这可能吗?

编辑:这里有一个小例子:

 import numpy as n
f, axarr = plt.subplots(2,sharex=True)
axarr[1].set_ylim([0.611,0.675])
axarr[0].set_ylim([0.792,0.856])
axarr[0].plot([0, 0.04, 0.08],n.array([ 0.83333333,  0.82250521,0.81109048]), label='test1')
axarr[0].errorbar([0, 0.04, 0.08],n.array([ 0.8,  0.83,   0.82]),n.array([0.1,0.1,0.01]), label='test2')
axarr[1].plot([0, 0.04, 0.08],n.array([ 0.66666667,  0.64888304,  0.63042428]))
axarr[1].errorbar([0, 0.04, 0.08],n.array([ 0.67,  0.64,  0.62]),n.array([ 0.01,  0.05,  0.1]))
axarr[0].legend(bbox_to_anchor=(0.04, 0.82, 1., .102),labelspacing=0.1,       handlelength=0.1, handletextpad=0.1,frameon=False, ncol=4, columnspacing=0.7)

在此处输入图像描述

我认为让我感到困惑的是图例实际上并不是从 0.82 开始的,事实上对于我更大的图(有 5 个这种类型的子图),我需要使用图例坐标 bbox_to_anchor=(0.04, 1.15, 1., .102)为了使图例出现在坐标 (0.02, 0.83) 上。但也许我弄错了什么?

原文由 mzzx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 324
2 个回答

loc 参数指定图例放置在边界框的哪个角。 loc 的默认值是 loc="best" 当使用 bbox_to_anchor 参数时会产生不可预测的结果。

因此,在指定 bbox_to_anchor 时,也 始终 指定 loc

bbox_to_anchor 的默认值是 (0,0,1,1) ,它是完整轴上的边界框。如果指定了不同的边界框,通常使用前两个值就足够了,它们给出了边界框的 (x0, y0)。

下面是一个示例,其中边界框设置为位置 (0.6,0.5) (绿点)和不同的 loc 参数被测试。因为图例延伸到边界框之外, loc 参数可以解释为“图例的哪个角应放置在 2 元组 bbox_to_anchor 参数给定的位置”。

在此处输入图像描述

 import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6, 3
fig, axes = plt.subplots(ncols=3)
locs = ["upper left", "lower left", "center right"]
for l, ax in zip(locs, axes.flatten()):
    ax.set_title(l)
    ax.plot([1,2,3],[2,3,1], "b-", label="blue")
    ax.plot([1,2,3],[1,2,1], "r-", label="red")
    ax.legend(loc=l, bbox_to_anchor=(0.6,0.5))
    ax.scatter((0.6),(0.5), s=81, c="limegreen", transform=ax.transAxes)

plt.tight_layout()
plt.show()

尤其是 这个答案 的详细解释和问题 What does a 4-element tuple argument for ‘bbox_to_anchor’ mean in matplotlib? .


如果要在轴坐标以外的其他坐标中指定图例位置,可以使用 bbox_transform 参数来实现。如果使用图形坐标可能有意义

ax.legend(bbox_to_anchor=(1,0), loc="lower right",  bbox_transform=fig.transFigure)

使用数据坐标可能没有太大意义,但由于您要求它,这将通过 bbox_transform=ax.transData 完成。

原文由 ImportanceOfBeingErnest 发布,翻译遵循 CC BY-SA 3.0 许可协议

我经常使用的方式是 legend 函数中的 loc 参数。字符串输入效果很好:

 plt.legend(loc = "upper left")

正如文档所说,对于字符串引用,您可以使用:

         ===============   =============
        Location String   Location Code
        ===============   =============
        'best'            0
        'upper right'     1
        'upper left'      2
        'lower left'      3
        'lower right'     4
        'right'           5
        'center left'     6
        'center right'    7
        'lower center'    8
        'upper center'    9
        'center'          10
        ===============   =============

原文由 Jefeter_7 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题