繁体   English   中英

如何将图形级 matplotlib 图例移动到 seaborn displot 的轴

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM