如何让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
相关产品推荐
相关产品推荐

