首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在图形坐标中指定matplotlib中的图例位置

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

Stack Overflow用户
提问于 2017-06-07 12:44:52
回答 5查看 274.6K关注 0票数 84

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

如何将传说从情节中剔除

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

编辑:下面是一个小例子:

代码语言:javascript
运行
复制
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)上。但也许我有别的地方错了?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-07 14:01:52

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参数可能被解释为“图例的哪个角将放置在由二元组bbox_to_anchor参数给定的位置”。

代码语言:javascript
运行
复制
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()

关于详细的解释和问题锚指的是马特普利布?,请参见这个答案

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

代码语言:javascript
运行
复制
ax.legend(bbox_to_anchor=(1,0), loc="lower right",  bbox_transform=fig.transFigure)

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

票数 136
EN

Stack Overflow用户

发布于 2021-03-18 16:01:31

我经常使用的方法是在图例函数中使用loc参数。字符串输入工作得很好:

代码语言:javascript
运行
复制
plt.legend(loc = "upper left")

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

代码语言:javascript
运行
复制
        ===============   =============
        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
        ===============   =============
票数 23
EN

Stack Overflow用户

发布于 2020-05-03 13:11:30

根据matplotlib图例文档

位置也可以是两个元组,以轴坐标表示图例左下角的坐标(在这种情况下,bbox_to_anchor将被忽略)。

因此,我们可以利用:

代码语言:javascript
运行
复制
plt.legend(loc=(x, y))

将图例的左下角设置为指定的(x, y)位置。

注意,这里的xy坐标是相对的,这意味着x=0是图中最左边的点,x=1是最右边的点。同样地,y=0y=1在地势高度上也是如此。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44413020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档