大家好,我是你们的小帅学长。
当你把散点图画清楚之后,下一步几乎一定会发生一件事:有没有趋势?关系强不强?
于是很多人会直接加一条直线,然后写一句:“二者呈显著正相关。”
但这里有一个非常关键的问题:你画的那条线,真的对吗?
这一篇,我们就讲清楚一件事:回归拟合线该怎么画?什么时候用线性?什么时候必须非线性?
01.回归线到底在表达什么?
回归线不是为了“好看”,而是为了表达变量之间的关系结构。
它回答的是:x 增加,y 会怎么变化?
是线性关系,还是弯曲关系?
变化趋势是否稳定?
02.最常见错误:默认用线性回归
很多人一看到散点图就写:
然后直接画直线。
但现实是,散点不是线性的。
例如:温度 vs 作物产量(通常是倒 U 型)
浓度 vs 反应速率(非线性)
遥感反演中的物理关系(强非线性)
如果你强行用线性拟合会产生“假趋势”。
03.怎么判断用线性还是非线性?
1.先看散点形状
2.再看残差
如果残差呈现,随 x 变化有结构,说明线性模型不合适。这也是下一篇我们要讲的内容。
04.三种常见拟合方式
1.线性拟合(最基础)
适用于:关系近似线性
可解释性要求高
2.多项式拟合
适用于:轻微弯曲关系
数据非严格线性
3.非参数拟合(如 LOESS / KDE)
适用于:不知道函数形式
数据复杂
05.论文级回归拟合代码
回归线不是用来“贴数据”的,而是用来“解释关系”的。下面是一套标准的可复用的代码:
import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmwin_fonts = r"C:\Windows\Fonts"for p in [ os.path.join(win_fonts, "times.ttf"), os.path.join(win_fonts, "timesbd.ttf"), os.path.join(win_fonts, "timesi.ttf"), os.path.join(win_fonts, "simsun.ttc"),]:if os.path.exists(p):try: fm.fontManager.addfont(p)except Exception:passmpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = FalseOUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)# =========================# 构造非线性数据# =========================np.random.seed(42)x = np.linspace(-3, 3, 300)y = 0.5 * x**2 + x + np.random.normal(0, 1, 300)# =========================# 拟合# =========================coef1 = np.polyfit(x, y, 1)y_linear = np.poly1d(coef1)(x)coef2 = np.polyfit(x, y, 2)y_quad = np.poly1d(coef2)(x)fig, ax = plt.subplots(figsize=(6,5))ax.scatter(x, y, s=12, alpha=0.35, color="#4C78A8")ax.plot(x, y_linear, color="red", linewidth=2, label="Linear Fit")ax.plot(x, y_quad, color="green", linewidth=2, linestyle="--", label="Quadratic Fit")ax.set_title("Regression Fit / 回归拟合对比", fontsize=14)ax.set_xlabel("X Variable / 自变量", fontsize=12)ax.set_ylabel("Y Variable / 因变量", fontsize=12)ax.legend(frameon=False)for spine in ax.spines.values():spine.set_linewidth(1.2)out_path = os.path.join(OUT_DIR, "regression_fit.jpg")fig.savefig(out_path, dpi=300, bbox_inches="tight")plt.close()print("Saved:", out_path)

选择正确的回归模型,比画一条更贴合的线更重要。
回归线画完之后,还有一个更关键的问题,这个模型靠谱吗?
我们需要一个工具来检查,是否拟合合理、是否存在系统误差、是否有结构性问题?
这就是下一篇:《残差图》
它会告诉你,你的回归,到底有没有问题。
——期待你的关注——
往期内容:
用Python做科研级画图——分组散点的编码策略
用Python做科研级画图——雨云图
用Python做科研级画图——小提琴图
用Python做科研级画图——KDE密度
用Python做科研级画图——散点图基础模板
用Python做科研级画图——异常值可视化
硕博做科研必备技能:用Python做科研级画图——为什么用Python画图?因为Python作图可复现、批量化、可控