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

