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

如何在Matplotlib的2×2子图散点图中添加最佳拟合线

解决2×2子图批量添加最佳拟合线的问题

Got it,针对你这个2×2子图批量加拟合线的需求,完全不用手动算参数!用numpy.polyfit就能自动完成拟合计算,我还给你优化了代码结构,避免重复写四次几乎一样的逻辑~

完整优化代码示例

import matplotlib.pyplot as plt
import numpy as np

# 假设你已经准备好共用的x数据,以及y1、y2、y3、y4四个y轴数据集
fig, axs = plt.subplots(2, 2, figsize=(20, 18))

# 把需要处理的y数据、子图的y标签整理成列表,方便循环对应
y_datasets = [y1, y2, y3, y4]
y_labels = ['Title Two', 'Title Three', 'Title Four', 'Title Five']
x_label = 'Title One'  # 共用x轴标签

# 遍历每个子图和对应的y数据集
for idx, ax in enumerate(axs.flat):
    # 绘制散点图,加alpha让密集数据更通透
    ax.scatter(x, y_datasets[idx], color='tab:blue', alpha=0.6)
    
    # 自动计算线性拟合参数:斜率(m)和截距(b)
    # 最后一个参数1代表一阶多项式(线性拟合),要二次拟合就改成2
    m, b = np.polyfit(x, y_datasets[idx], 1)
    
    # 生成拟合线的y值(如果x无序,用下面的平滑版更美观)
    # 平滑版:x_fit = np.linspace(min(x), max(x), 100)
    fit_y = m * x + b
    
    # 绘制拟合线,添加图例显示拟合公式
    ax.plot(x, fit_y, color='tab:red', linestyle='--', linewidth=2,
            label=f'Best Fit: y = {m:.2f}x + {b:.2f}')
    
    # 设置轴标签和样式
    ax.set_xlabel(x_label, fontsize=15)
    ax.set_ylabel(y_labels[idx], fontsize=15)
    ax.legend(fontsize=12)
    ax.tick_params(axis='both', labelsize=12)

plt.tight_layout()  # 自动调整子图间距,避免标签重叠
plt.show()

关键细节说明

  • 批量处理逻辑:用axs.flat把2×2的子图数组展平成一维,配合循环一次性处理四个子图,省去重复写代码的麻烦
  • 自动拟合:np.polyfit会根据输入的x和y数据自动计算最优拟合参数,数据量再大也能轻松处理,完全不用手动计算
  • 拟合灵活性:如果你的数据不是线性关系,只需要修改np.polyfit的第三个参数(比如二次拟合写2);要是想做指数拟合,可以先对x取对数再用线性拟合转换
  • 平滑拟合线:如果你的x数据是无序的,直接用原始x画拟合线可能会出现折线,这时候换成np.linspace(min(x), max(x), 100)生成均匀分布的x值,再计算拟合y值,画出的线会更平滑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:37:26