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

如何让Seaborn散点图中的NOK数据点更清晰可见?

解决样本不平衡下散点图NOK数据点不可见的问题

针对你样本量严重不平衡(OK 60000条、NOK仅160条)且x轴为时间轴的情况,以下几种方案可以快速让NOK数据点清晰显示:

方法1:分层绘制+差异化样式

先绘制OK样本(降低透明度+缩小标记),再叠加绘制NOK样本(高透明度+大标记+醒目样式),让NOK点直接突出:

import seaborn as sns
import matplotlib.pyplot as plt

for i in X.columns:
    plt.figure(figsize=(12,6))
    # 绘制OK样本,用低透明度和小标记弱化显示
    sns.scatterplot(data=df[df['Desc Level 2'] == 'OK'], x='Time', y=i, 
                    color='lightblue', alpha=0.3, s=10, label='OK')
    # 绘制NOK样本,用高对比度颜色、大标记和特殊样式强化显示
    sns.scatterplot(data=df[df['Desc Level 2'] == 'NOK'], x='Time', y=i, 
                    color='darkred', alpha=1, s=50, marker='*', label='NOK')
    plt.title(f'Time vs {i}')
    plt.legend()
    plt.show()

方法2:用参数映射区分两类样本

通过size和alpha参数直接绑定类别,自动调整样式,代码更简洁:

for i in X.columns:
    plt.figure(figsize=(12,6))
    # 定义类别对应的标记大小、透明度和颜色
    style_config = {
        'sizes': {'OK':10, 'NOK':50},
        'alpha_dict': {'OK':0.2, 'NOK':1},
        'palette': {'OK':'gray', 'NOK':'crimson'}
    }
    sns.scatterplot(data=df, x='Time', y=i, hue='Desc Level 2',
                    size='Desc Level 2', alpha='Desc Level 2', **style_config)
    plt.title(f'Time vs {i}')
    plt.legend(bbox_to_anchor=(1.05,1), loc='upper left')
    plt.show()

方法3:添加NOK区域放大子图(可选)

如果NOK样本集中在特定时间区间,可以在主图旁增加子图放大该区域,进一步看清细节:

for i in X.columns:
    fig, (ax_main, ax_zoom) = plt.subplots(2,1, figsize=(12,10), gridspec_kw={'height_ratios': [3,1]})
    # 主图绘制全部数据
    sns.scatterplot(data=df[df['Desc Level 2'] == 'OK'], x='Time', y=i, 
                    color='lightgray', alpha=0.3, s=10, ax=ax_main, label='OK')
    sns.scatterplot(data=df[df['Desc Level 2'] == 'NOK'], x='Time', y=i, 
                    color='darkred', alpha=1, s=50, marker='*', ax=ax_main, label='NOK')
    ax_main.set_title(f'Time vs {i}')
    ax_main.legend()
    
    # 子图放大NOK所在时间范围
    nok_time_range = df[df['Desc Level 2'] == 'NOK']['Time']
    time_min, time_max = nok_time_range.min(), nok_time_range.max()
    # 给时间范围加少量边距,避免边缘点被截断
    margin = (time_max - time_min) * 0.05
    ax_zoom.set_xlim(time_min - margin, time_max + margin)
    sns.scatterplot(data=df[df['Desc Level 2'] == 'OK'], x='Time', y=i, 
                    color='lightgray', alpha=0.3, s=10, ax=ax_zoom)
    sns.scatterplot(data=df[df['Desc Level 2'] == 'NOK'], x='Time', y=i, 
                    color='darkred', alpha=1, s=50, marker='*', ax=ax_zoom)
    ax_zoom.set_title('NOK Samples Zoomed')
    
    plt.tight_layout()
    plt.show()

以上方案均无需转换时间轴类型,直接基于scatterplot调整即可有效突出少量NOK样本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:25:25