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

如何在Seaborn中合并catplot图例与其他图例并自定义标签

合并Catplot与自定义绘图的图例并替换标签

要实现合并两个图例、统一放置在右上角并替换标签的需求,你可以按以下步骤修改代码:

  1. 获取catplot生成的图例手柄(handles)和标签(labels),用指定映射替换标签
  2. 收集自定义水平线的手柄和标签,同步替换对应标签
  3. 合并两组手柄和标签,创建新的统一图例,同时隐藏原有图例

完整代码示例:

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
# 绘制catplot
g = sns.catplot(x="day", y="total_bill", hue="smoker", kind="violin", 
                inner='quartile', split=True, data=tips)

# 定义标签映射字典
label_mapping = {"Avg tip": "average", "Yes": "Smoker", "No": "Non smoker",
                 "+1 std": "+1 standard deviation", "-1 std": "-1 standard deviation"}

# 获取catplot的图例手柄和标签,替换标签
cat_handles = g._legend.legendHandles
cat_labels = [t.get_text() for t in g._legend.get_texts()]
cat_labels = [label_mapping.get(label, label) for label in cat_labels]

# 绘制自定义水平线,修正原代码变量名错误
mean_val = tips.total_bill.mean()
std_val = tips.total_bill.std()
l1 = plt.axhline(mean_val, ls='--', color='k', alpha=0.3, zorder=0, label='Avg tip')
l2 = plt.axhline(mean_val + std_val, ls='--', color='r', alpha=0.1, zorder=0, label='+1 std')
l3 = plt.axhline(mean_val - std_val, ls='--', color='b', alpha=0.1, zorder=0, label='-1 std')

# 收集自定义线的手柄和标签,替换标签
custom_handles = [l1, l2, l3]
custom_labels = [label.get_label() for label in custom_handles]
custom_labels = [label_mapping.get(label, label) for label in custom_labels]

# 合并手柄和标签
all_handles = cat_handles + custom_handles
all_labels = cat_labels + custom_labels

# 移除原catplot的图例
g._legend.remove()

# 创建新的统一图例,放置在右上角
plt.legend(handles=all_handles, labels=all_labels, title='', loc='upper right')

plt.show()

关键说明:

  • 修正了原代码中变量重复定义的错误(重复使用l2,未定义l3)
  • 通过g._legend直接获取catplot的图例元素,避免复杂的绘图对象操作
  • 用字典映射批量替换标签,适配后续更复杂的标签修改需求
  • 必须先移除原有图例,再创建新图例,避免页面出现重复图例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:05:04