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

Python 如何在matplotlib中以图形坐标指定图例位置,python,matplotlib,Python,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

我知道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)上。但也许我弄错了什么?

您可以使用loc参数更改图例的位置。


loc
参数指定图例放置在边界框的哪个角。
loc
的默认值是
loc=“best”
,当使用
bbox\u to\u锚定
参数时,会产生不可预测的结果。
因此,当指定
bbox\u至\u锚定时,始终也指定
loc

bbox\u to\u anchor
的默认值为
(0,0,1,1)
,它是整个轴上的边界框。如果指定了不同的边界框,则通常足以使用前两个值,这两个值给出了边界框的(x0,y0)

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

有关详细的解释和问题,请参见


如果要在轴坐标以外的其他坐标中指定图例位置,可以使用
bbox\u transform
参数进行指定。如果可能的话,可以使用图形坐标

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

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

完成。除了@ImportanceOfBeingErnest的帖子外,我还使用以下行在绘图的绝对位置添加图例

plt.legend(bbox_to_anchor=(1.0,1.0),\
    bbox_transform=plt.gcf().transFigure)
由于未知原因,
bbox\u transform=fig.transformure
对我不起作用。

根据:

该位置也可以是一个2元组,给出图例左下角在轴坐标中的坐标(在这种情况下,将忽略bbox_到_锚定)

因此,可以使用:

plt.legend(loc=(x, y))
将图例的左下角设置为指定的
(x,y)
位置。

我经常使用的方法是图例函数中的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
        ===============   =============

由于默认情况下,bbox_to_anchor参数采用轴坐标,正如您所希望的那样,因此不清楚解决方案与链接问题的距离有多远对您没有帮助。您可能想给出一个您试图实现的示例,和/或更好地解释解决方案与您所寻求的不符的程度。谢谢-我已经编辑了它。但也许你是对的,我只是误解了matplotlib通常是如何放置这些图例的-你知道图例的哪个角被放置在给bbox_to_锚定的坐标上吗?我想我已经有了完整的解释。还有一个指向include的链接,显示了如何将4元组bbox_转换为_锚规范。我可能仍然想在这里回答你的问题,但为此,我需要知道你在问“图例出现在坐标(0.02,0.83)上”时的确切意思是什么?你想要的是左下角吗?对不起,我以为我仔细看过了另一篇文章,但是我还没有向下滚动到足够远的地方来看到你的答案——谢谢你,现在我正在努力理解这一点。是的,我确实想把左下角放在这些坐标上。好吧,对不起,只是想检查一下我是否正确:所以当我说loc=“upper right”,并且没有给出bbox_to_锚定规范时,matplotlib将其解释为相对于轴的loc。但是,当我说loc=“右上”并给出一个bbox_to_锚定规范时,该bbox_to_锚定规范将根据轴进行解释,loc关键字指的是图例的一角?对不起-bbox_to_锚定和loc关键字如何交互?bbox_to_锚定是否将图例放置在loc环境中的某个位置?loc参数将通知matplotlib应将图例边界框的哪一部分放置在bbox_to_锚定的参数处。@mzzx如果您认为此答案有用(与您是否接受它无关)您仍然可以向上投票-这与说“谢谢”类似。这可能是因为您有多个图形。要选择当前图形,您可以使用
plt.figure(fig.number)
,然后使用
fig.transFigure
命令,它应该可以工作。
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
        ===============   =============