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

Seaborn Scatterplot图例缺失系列:如何强制显示全部分类?

解决Seaborn散点图强制显示全部图例项的问题

当DataFrame中isValid字段全为True或False时,Seaborn的scatterplot会自动隐藏不存在的类别图例。要强制显示"Approved"(对应True)和"Rejected"(对应False)两个图例项,无需重复绘图,有两种可行方案:

方案一:手动构建自定义图例

先正常绘制散点图,再手动创建两个图例元素替换默认图例,确保两个类别都显示:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.patches import Patch

# 示例DataFrame(此处为全True的情况)
df = pd.DataFrame({
    'Depth': [10.2, 15.5, 8.7],
    'Std': [0.3, 0.5, 0.2],
    'isValid': [True, True, True]
})

# 绘制散点图
ax = sns.scatterplot(data=df, x='Std', y='Depth', hue='isValid')

# 定义标签映射与调色板
label_map = {True: 'Approved', False: 'Rejected'}
palette = sns.color_palette()  # 布尔型hue默认使用两个颜色

# 创建图例元素
legend_elements = [
    Patch(facecolor=palette[0], label=label_map[False]),
    Patch(facecolor=palette[1], label=label_map[True])
]

# 替换默认图例
ax.legend(handles=legend_elements, title='Status')

plt.show()

方案二:将字段转为固定类别的分类类型

把isValid转为包含[False, True]所有可能值的分类列,Seaborn会自动保留全部类别图例:

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

# 示例DataFrame
df = pd.DataFrame({
    'Depth': [10.2, 15.5, 8.7],
    'Std': [0.3, 0.5, 0.2],
    'isValid': [True, True, True]
})

# 将isValid转为分类类型,指定所有可能类别
df['isValid'] = pd.Categorical(df['isValid'], categories=[False, True], ordered=True)

# 绘制散点图
ax = sns.scatterplot(data=df, x='Std', y='Depth', hue='isValid')

# 修改图例标签为自定义文本
handles, _ = ax.get_legend_handles_labels()
ax.legend(handles=handles, labels=['Rejected', 'Approved'], title='Status')

plt.show()

两种方案都能避免重复绘图,强制显示两个图例项:方案一更灵活,适合自定义图例样式;方案二更简洁,依赖Pandas分类类型的特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:36:21