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

Seaborn pairplot遇全NaN数据集出现异常点,如何保留双图例并消除?

解决Seaborn Pairplot空数据集的幽灵点问题

问题根源在于你用全NaN的行来占位空数据集,Seaborn绘图时会错误渲染这个空行产生幽灵点;同时如果不指定分类类别,空类别的图例会自动消失。下面是最优解决方案:


核心思路

移除全NaN的空行,用pd.Categorical指定hue字段的所有可能类别,这样既保留两个图例标识,又彻底避免幽灵点的产生。

修改后的代码

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

# 定义所有需要在图例中显示的status类别
status_categories = ['Success', 'Fail']

# 模拟动态场景:df1可能为空或有数据
df1_has_data = False  # 切换True/False可测试两种场景
if df1_has_data:
    df1 = pd.DataFrame({
        r'x': np.random.rand(50),
        r'y': np.random.rand(50),
        r'z': np.random.rand(50)
    })
    df1['status'] = 'Success'
else:
    # 空数据集无需创建全NaN行,直接跳过
    df1 = None

# 有效数据集
df2 = pd.DataFrame({
    r'x': np.random.rand(100),
    r'y': np.random.rand(100),
    r'z': np.random.rand(100)
})
df2['status'] = 'Fail'

# 合并数据集(仅当df1存在时)
if df1 is not None:
    df_combined = pd.concat([df2, df1])
else:
    df_combined = df2

# 设置status为分类类型,强制保留所有指定类别
df_combined['status'] = pd.Categorical(df_combined['status'], categories=status_categories)

# 绘制角图
pp = sns.pairplot(df_combined, hue='status', corner=True, diag_kind='hist', diag_kws={'common_norm': False, 'stat': 'probability'})
pp._legend.set_bbox_to_anchor((0.95, 0.75))
plt.tight_layout()
plt.show()

关键说明

  • 用pd.Categorical指定类别后,即使某个类别没有对应数据,Seaborn也会在图例中保留它的标识。
  • 移除全NaN的空行,从根源上避免了幽灵点的产生,因为Seaborn不会处理不存在的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 04:03:09