![](/img/trans.png)
[英]How to edit a seaborn legend title and labels for figure-level functions
[英]How to move figure-level matplotlib legend to axes of a seaborn displot
我正在调用sns.displot
来获取FacetGrid
g = sns.displot(
data=df_all,
x='a_number',
hue='a_condition',
row='a_factor',
col='another_factor',
stat="density",
common_norm=False,
element='step',
palette=palette,
)
与这个问题类似,我想将自动生成的图例放在其中一个轴上,而不是作为图形级图例放在它们外面: How to put the legend on first subplot of seaborn.FacetGrid?
仅调用g.fig.axes[row][col].legend()
不起作用:
No handles with labels found to put in legend.
所以我应该生成句柄和标签? 我查看了Grid.add_legend
是如何做到这一点的,这似乎是一种魔法,需要我更多地了解 class 如何重现它(也许我错了)。 也没有_legend_data
可用于以与Grid.add_legend
方法相同的方式动态重新创建图例。
>>> g._legend_data
{}
“简单”(懒惰?)的方法是,如果我能以某种方式复制legend
实例,将该副本添加到我想要的轴,然后调用g.fig._legend.remove()
(除非有人有更好的想法)
我不知道如何复制图例,然后将其分配给特定的Axes
。
我突然意识到我可以调用g.legend.set_bbox_to_anchor()
作为解决方法。
在这种情况下,图例仍然是图形级别的,但它可以让我把它放在我想要的地方。
编辑:
@mwaskom 在 GitHub 问题上回复了这个评论的链接,其中有一个代码片段可以实现我的想法:
https://github.com/mwaskom/seaborn/issues/2280#issuecomment-692350136
为了我的目的,我像这样调整了它
def move_legend(g, ax, new_loc, **kws):
old_legend = g.legend
handles = old_legend.legendHandles
labels = [t.get_text() for t in old_legend.get_texts()]
title = old_legend.get_title().get_text()
ax.legend(handles, labels, loc=new_loc, title=title, **kws)
move_legend(g, g.fig.axes[-2], "upper right")
g.legend.remove()
关于幕后发生的事情的相关讨论就是关于那个问题的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.