当前位置:首页>python>用Python做科研级画图——回归拟合线

用Python做科研级画图——回归拟合线

  • 2026-10-11 07:58:01
用Python做科研级画图——回归拟合线

大家好,我是你们的小帅学长。

当你把散点图画清楚之后,下一步几乎一定会发生一件事:有没有趋势?关系强不强?

于是很多人会直接加一条直线,然后写一句:“二者呈显著正相关。”

但这里有一个非常关键的问题:你画的那条线,真的对吗?

这一篇,我们就讲清楚一件事:回归拟合线该怎么画?什么时候用线性?什么时候必须非线性?

01.回归线到底在表达什么?

回归线不是为了“好看”,而是为了表达变量之间的关系结构。

它回答的是:x 增加,y 会怎么变化?

      是线性关系,还是弯曲关系?

      变化趋势是否稳定?

02.最常见错误:默认用线性回归

很多人一看到散点图就写:

y = ax + b

然后直接画直线。

但现实是,散点不是线性的。

例如:温度 vs 作物产量(通常是倒 U 型)

  浓度 vs 反应速率(非线性)

  遥感反演中的物理关系(强非线性)

如果你强行用线性拟合会产生“假趋势”。

03.怎么判断用线性还是非线性?

1.先看散点形状

形状
模型
直线趋势
线性
弯曲趋势
多项式 / 非线性
S 型
Logistic
多峰
不适合简单回归

2.再看残差

如果残差呈现,随 x 变化有结构,说明线性模型不合适。这也是下一篇我们要讲的内容。

04.三种常见拟合方式

1.线性拟合(最基础)

y = ax + b

适用于:关系近似线性

   可解释性要求高

2.多项式拟合

y = ax² + bx + c

适用于:轻微弯曲关系

   数据非严格线性

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作图可复现、批量化、可控

最新文章

随机文章