如何优化seaborn绘制的预测值与测试值对比散点图效果?

预测值与真实值对比散点图优化实现
先说明你之前代码没生效的核心原因:
plt.axis('equal')仅强制坐标轴物理像素比例1:1,不会自动对齐两个轴的取值范围,很容易出现图形拉伸变形的问题- 绘制y=x线时参数传错:
plt.plot接收的格式为(x序列起点, x序列终点), (y序列起点, y序列终点),你写的plt.plot((0,0), (30,30))实际绘制的是x固定为0、y从0到30的竖线,只要轴范围没覆盖x=0的位置就看不到这条线。
以下是对应三个需求的可直接运行的实现方案:
1. 坐标轴同比例尺对齐
不要直接用plt.axis('equal'),先统一两个轴的取值范围再设置等比例:
import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 计算预测值、真实值的公共取值范围,预留5%边距避免点贴在坐标轴边缘 all_data = np.concatenate([y_pred, y_true]) data_min, data_max = all_data.min(), all_data.max() pad = (data_max - data_min) * 0.05 axis_lim = [data_min - pad, data_max + pad] # 绘制散点,加透明度解决多点重叠问题 sns.scatterplot(x=y_pred, y=y_true, alpha=0.6) # 统一两轴范围 plt.xlim(axis_lim) plt.ylim(axis_lim) # 强制1:1等比例 plt.gca().set_aspect('equal', adjustable='box') # 添加网格 plt.grid(linestyle='--', alpha=0.7)
2. 绘制y=x参考线
直接用已经计算好的轴范围绘制,不需要硬编码固定数值区间,适配任意取值范围的数据集:
plt.plot(axis_lim, axis_lim, 'r--', linewidth=2, label='y=x 理想预测线') plt.legend()
执行后参考线会从坐标轴左下角贯穿到右上角,不会出现显示不全、位置错位的问题。
3. 自动聚焦点位密集区/识别离群点
不需要手动从数据集删除离群点,两种常用实现方案:
- 方案1:分位数自动截断轴范围
取数据集的分位数作为轴边界,自动过滤极端离群点的视觉干扰,比如取1%和99%分位数即可覆盖98%的有效点位:# 计算联合分位数,避免单维度截断偏差 low_bound = np.quantile(all_data, 0.01) high_bound = np.quantile(all_data, 0.99) plt.xlim(low_bound, high_bound) plt.ylim(low_bound, high_bound) - 方案2:离群点分层绘制
用离群点检测算法自动识别异常值,将离群点用浅灰色小尺寸标记绘制在底层,正常点位用高亮色绘制在顶层,既保留完整数据信息,又不会让离群点压缩密集区的显示空间:from sklearn.neighbors import LocalOutlierFactor # 自动识别离群点,contamination参数可根据数据实际离群占比调整 clf = LocalOutlierFactor(n_neighbors=20, contamination=0.05) point_features = np.column_stack([y_pred, y_true]) outlier_label = clf.fit_predict(point_features) # 先绘制离群点 sns.scatterplot(x=y_pred[outlier_label==-1], y=y_true[outlier_label==-1], color='lightgray', s=20, label='离群点') # 再绘制正常点位 sns.scatterplot(x=y_pred[outlier_label==1], y=y_true[outlier_label==1], alpha=0.6, label='正常点位')
额外优化建议
- 散点设置
alpha=0.5~0.7的透明度,点位重叠区域会通过颜色深浅直观反映密度 - 可以替换
sns.scatterplot为sns.regplot,自动添加预测值和真实值的拟合趋势线与置信区间,方便对比和理想y=x线的偏移程度 - 可在图面空白处标注RMSE、R²等模型评估指标,不用额外切换窗口查计算结果
- 网格线使用浅灰色虚线,降低视觉权重,避免干扰散点本身的展示
内容的提问来源于stack exchange,提问作者strivn
相关产品推荐
相关产品推荐

