mzz*_*zzx 30 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,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)
Run Code Online (Sandbox Code Playgroud)
我觉得让我感到困惑的是,传说实际上并没有从0.82开始,实际上对于我的大图(有5个这种类型的子图),我需要使用图例坐标bbox_to_anchor =(0.04,1.15,1.,.010)为了使图例出现在坐标(0.02,0.83)上.但也许我得到别的错了?
Imp*_*est 43
该loc参数指定图例放置在边界框的哪个角落.默认loc值为 loc="best",在使用bbox_to_anchor参数时会产生不可预测的结果.
因此,在指定时bbox_to_anchor,也始终指定loc.
bbox_to_anchoris 的默认值(0,0,1,1),它是整个轴上的边界框.如果指定了不同的边界框,则通常足以使用前两个值,它们给出边界框的(x0,y0).
下面是将边界框设置为位置(0.6,0.5)(绿点)并loc测试不同参数的示例.因为图例范围在边界框之外,所以该loc参数可以被解释为"图例的哪个角应该放置在由2元组bbox_to_anchor参数给出的位置".
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()
Run Code Online (Sandbox Code Playgroud)
请参阅此答案以获取详细解释和问题'bbox_to_anchor'的4元素元组参数在matplotlib中的含义是什么?.
bbox_transform参数进行指定.如果使用图形坐标可能有意义
ax.legend(bbox_to_anchor=(1,0), loc="lower right", bbox_transform=fig.transFigure)
Run Code Online (Sandbox Code Playgroud)
使用数据坐标可能没有多大意义,但是因为你要求它,这将通过bbox_transform=ax.transData.
小智 23
该位置也可以是一个 2 元组,给出图例左下角在轴坐标中的坐标(在这种情况下bbox_to_anchor将被忽略)。
因此,人们可以使用:
plt.legend(loc=(x, y))
Run Code Online (Sandbox Code Playgroud)
将图例的左下角设置到指定(x, y)位置。
请注意,此处的x和y坐标是相对的,这意味着x=0是图中最左边的点,x=1也是图中最右边的点。类似地,对于y=0和y=1沿着图的高度,其中y=0是底部,y=1是顶部。
小智 10
我经常使用的方式是图例函数中的loc参数。字符串输入效果很好:
plt.legend(loc = "upper left")
Run Code Online (Sandbox Code Playgroud)
正如文档所说,对于字符串引用,您可以使用:
=============== =============
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
=============== =============
Run Code Online (Sandbox Code Playgroud)
您可以使用 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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70873 次 |
| 最近记录: |