Python如何为多个seaborn KDE子图设置统一共享图例
多子图统一图例问题修正方案
错误原因
axes是plt.subplots返回的子图对象数组,本身没有get_legend_handles_labels方法,直接调用数组的该方法会报错sns.kdeplot(...).set(...)中的set()方法返回值为None,使用g, = ...解包会直接触发语法报错- 仅在最后一个子图
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
相关产品推荐
相关产品推荐

