当前位置: 首页 > 知识库问答 >
问题:

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

潘楚
2023-03-14

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

共有3个答案

梁丘书
2023-03-14

您可以使用loc参数更改图例的位置。https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.legend.html?highlight=legend#matplotlib.axes.Axes.legend

import matplotlib.pyplot as plt

plt.subplot(211)
plt.plot([1,2,3], label="test1")
plt.plot([3,2,1], label="test2")
# Place a legend above this subplot, expanding itself to
# fully use the given bounding box.
plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
           ncol=2, mode="expand", borderaxespad=0.)

plt.subplot(223)
plt.plot([1,2,3], label="test1")
plt.plot([3,2,1], label="test2")
# Place a legend to the right of this smaller subplot.
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()
翁心思
2023-03-14

我经常使用的方法是在图例函数中使用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
        ===============   =============
夏朝
2023-03-14

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

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

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

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_to_anchor”的4元素元组参数在matplotlib中的含义是什么?”。

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

使用数据坐标可能没有太大意义,但由于您要求使用数据坐标,因此可以通过bbox\u transform=ax来实现。transData

 类似资料:
  • 我的极坐标图是什么样子的 我试图移动ytick标签,使它们与轴标签类似地对齐。例如,'PTS'标签水平对齐到其轴,但ytick标签向右移动。 对于y值标签,我使用set_rgrids()函数指定角度和标签值,并使用tick_params()函数指定标签属性,如旋转。但是,此函数不允许我设置标签的文本框对齐。 如何将y值向左移动,使其直接位于相应的轴标签下? 完整代码:

  • 问题内容: 有人可以告诉我如何修改此使用matplotlib的Python代码,以便无论绘制多少分,条的宽度都将保持恒定吗?先感谢您! 问题答案: 条的宽度相同!它们看起来不一样的原因是因为您正在使用以下行: 这将更改您的x值,从而更改x轴的比例。为了抵消这种影响,您可以更改x轴的限制,也可以使条形宽度取决于分数的数量,例如,如果0.35的宽度适用于10个分数,那么如果将分数的数量加倍,条宽度的一

  • 我目前使用matplotlib以以下方式生成图例: 这在某种程度上是可行的,见1。但我在我的传奇中复制了信息。 我宁愿把传说分开。所以我有不同颜色的线对应于时间t,一条法线作为我的解析解,一个点作为我的模拟结果。 诸如此类 --(红线)t=25 --(蓝线)t=50 --(绿线)t=500 模拟 --解析解 现在有人知道我如何用matplotlib实现这一点了吗?

  • 基本上,我有一个矩形位图,并希望创建一个新的正方形尺寸的位图,其中将包含其中的矩形位图。 因此,例如,如果源位图的宽度:100和高度:400,我想要一个宽度:400和高度:400的新位图。然后,绘制以这个新位图为中心的源位图(请参阅附加图像以更好地理解)。 我下面的代码很好地创建了方形位图,但没有将源位图绘制到其中。结果,我留下了一个完全黑色的位图。 这是代码: 知道我哪里做错了吗?

  • 我有以下数据集,并使用Matplotlib绘制了一个堆叠条形图。 以下是生成图形的代码: 我需要注释图形中的值。例如,我需要每个条的值出现在图形的条内。请参阅下面的示例

  • 我正在绘图中绘制多个多边形: 结果图正确地显示了我的多边形,但我想知道哪个多边形对应于图上的哪个索引(例如:绿色多边形是处的多边形)。理想情况下,我想要一个将多边形的颜色与其索引关联起来的图例,但我不知道如何在这样的循环中添加这样的图例。我试过但这不起作用。 多边形的数量是可变的,所以严格分配颜色是不可能的。 如何添加图例?