我知道bbox_to_锚关键字和这个线程,它非常有用地建议如何手动放置图例:
How to put the legend out of the plot
但是,我想使用图形中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_锚=(0.04,1.15,1.,.102)来使图例出现在坐标(0.02,0.83)上。
5条答案
按热度按时间beq87vna1#
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_锚参数给定的位置”。请特别参阅this answer以获得详细的解释和问题What does a 4-element tuple argument for 'bbox_to_anchor' mean in matplotlib?。
如果要以轴坐标以外的其他坐标指定图例位置,则可以使用
bbox_transform
参数。如果使用图坐标可能更有意义使用数据坐标可能没有太大意义,但既然你要求它,这将通过
bbox_transform=ax.transData
完成。f5emj3cl2#
我经常使用的方法是在legend函数中使用 loc 参数。字符串输入效果很好:
正如文档所说,对于字符串引用,您可以使用:用途:
6rvt4ljy3#
根据matplotlib legend documentation:
位置也可以是一个2元组,以轴坐标给出图例左下角的坐标(在这种情况下,*bbox_to_锚 * 将被忽略)。
因此,可以用途:
将图例的左下角设置为指定的
(x, y)
位置。请注意,这里的
x
和y
坐标是相对的,这意味着x=0
是图中最左边的点,x=1
是图中最右边的点。同样,y=0
和y=1
沿着图的高度,其中y=0
是底部,y=1
是顶部。t30tvxxf4#
您可以使用loc参数更改图例的位置。https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.legend.html?highlight=legend#matplotlib.axes.Axes.legend
eagi6jfj5#
除了@ImportanceOfBeingErnest的帖子之外,我还使用以下行在图中的绝对位置添加图例。
由于未知的原因,
bbox_transform=fig.transFigure
不适用于我。