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

Python如何为多个seaborn KDE子图设置统一共享图例

多子图统一图例问题修正方案

错误原因

  1. axes是plt.subplots返回的子图对象数组,本身没有get_legend_handles_labels方法,直接调用数组的该方法会报错
  2. sns.kdeplot(...).set(...)中的set()方法返回值为None,使用g, = ...解包会直接触发语法报错
  3. 仅在最后一个子图axes[3]开启了图例,其余子图都关闭了图例,不需要遍历所有子图拿句柄,直接从axes[3]提取即可

修正后完整代码

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

# 需提前定义好preds_full、preds_full_c两个变量
figure, axes = plt.subplots(1, 4, sharex=True, figsize=(16,4))

sns.set(style="darkgrid")
df = pd.concat(axis=0, ignore_index=True, objs=[
    pd.DataFrame.from_dict({'FYA': preds_full, '': 'original data'}),
    pd.DataFrame.from_dict({'FYA': preds_full_c, '': 'modified_data'})
])
df1 = pd.concat(axis=0, ignore_index=True, objs=[
    pd.DataFrame.from_dict({'FYA': preds_full_c, '': 'original data'}),
    pd.DataFrame.from_dict({'FYA': preds_full_c, '': 'modified_data'})
])
# 移除错误的解包赋值逻辑
sns.kdeplot(ax=axes[0], data=df, x='FYA', hue='', fill=True, palette=['skyblue','lightcoral'], legend=False).set(title='black<-->white') 
sns.kdeplot(ax=axes[3], data=df1, x='FYA', hue='', fill=True, palette=['skyblue','lightcoral'], legend=True).set(title='asian<-->white')
plt.setp(axes[3], ylabel='')

# 从已开启图例的axes[3]提取句柄和标签
handles, labels = axes[3].get_legend_handles_labels()
# 移除子图自带的图例,避免和全局图例重复显示
axes[3].get_legend().remove()
# 绘制全局统一图例
figure.legend(handles, labels, loc='upper right', ncol=2, bbox_to_anchor=(.75, 0.98))   

plt.show()

补充适配方案

如果多个子图的图例类别不完全一致,可以遍历所有子图收集句柄后去重,再传给全局图例:

handles = []
labels = []
for ax in axes:
    h, l = ax.get_legend_handles_labels()
    for hi, li in zip(h, l):
        if li not in labels:
            handles.append(hi)
            labels.append(li)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:00