You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Seaborn displot自定义图例:调整位置及获取图例句柄与标签的方法

这个问题很常见——Seaborn的FacetGrid(也就是displot返回的对象)的图例管理逻辑和普通Matplotlib轴的图例不太一样,所以直接用plt.legend或者单个轴的方法会失效。这里有几个实用的解决方案:

方法1:绘图时直接指定图例参数(最简单)

在调用displot的时候,使用legend_kws参数把图例的位置设置直接传进去,这个参数会把字典里的键值对传递给Matplotlib的Legend对象,一步到位:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'1': np.random.normal(1, 1, 20), '2': np.random.normal(3, 1, 20)})
df = df.melt()

# 直接在绘图时指定图例位置参数
g = sns.displot(df, x='value', hue='variable', kind='kde', 
                legend_kws={'loc': 'lower left', 'bbox_to_anchor': (0, 1)})
plt.show()

方法2:修改已生成的FacetGrid图例

如果你已经绘制好了图,想要事后调整位置,FacetGrid的图例存储在g.legend属性里,直接修改它的位置参数即可:

g = sns.displot(df, x='value', hue='variable', kind='kde')
# 调整图例的锚点和位置
g.legend.set_bbox_to_anchor((0, 1))
g.legend.set_loc('lower left')
plt.show()

方法3:手动获取句柄和标签重新创建图例

如果需要做更复杂的图例定制,确实要拿到句柄和标签的话,因为这是单面板的FacetGrid,你可以从第一个轴(g.axes.flat[0])里获取,然后移除原图例再重新添加:

g = sns.displot(df, x='value', hue='variable', kind='kde')

# 先移除原有的统一图例
g._legend.remove()

# 从第一个子轴获取句柄和标签
handles, labels = g.axes.flat[0].get_legend_handles_labels()

# 在目标位置添加新图例
g.axes.flat[0].legend(handles, labels, loc='lower left', bbox_to_anchor=(0, 1))
plt.show()

为什么之前的方法失效?

你用g.ax.get_legend_handles_labels()失败,是因为g.ax是FacetGrid的快捷方式,指向最后一个子轴;更关键的是,FacetGrid的图例是统一创建的,并不绑定在单个子轴的图例对象里,而是存放在g.legend属性中,所以直接调用单个轴的方法拿不到对应的句柄和标签。

内容的提问来源于stack exchange,提问作者Wouter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:53:11