我知道 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 许可协议
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 参数给定的位置”。尤其是 这个答案 的详细解释和问题 What does a 4-element tuple argument for ‘bbox_to_anchor’ mean in matplotlib? .
如果要在轴坐标以外的其他坐标中指定图例位置,可以使用
bbox_transform
参数来实现。如果使用图形坐标可能有意义使用数据坐标可能没有太大意义,但由于您要求它,这将通过
bbox_transform=ax.transData
完成。