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

Pandas结合Matplotlib:在对数X轴散点图上绘制回归直线

X轴对数刻度散点图绘制线性回归直线的问题解决

常见出错原因

  • 未在对数空间做回归拟合:直接用原始X值拟合线性模型,再在对数刻度轴上绘图,结果会变成曲线或不规则线段
  • 未对数据排序:拟合后的预测值和原始X的顺序不匹配,连线时会交叉混乱
  • 忽略缺失值:pandas Series里的缺失值会导致拟合结果异常

分步解决方法

1. 清理数据

先去掉两列里的缺失值,避免干扰拟合:

# 假设你的DataFrame是df,X列是'x_col',Y列是'y_col'
x = df['x_col'].dropna()
y = df['y_col'].dropna()

2. 在对数空间拟合回归

因为X轴用对数刻度,要先对X取对数,再拟合y ~ log(x)的线性模型:

import numpy as np
from sklearn.linear_model import LinearRegression

# 把对数转换后的X转成sklearn需要的二维数组格式
x_log = np.log(x).values.reshape(-1, 1)
model = LinearRegression()
model.fit(x_log, y)

# 计算预测值
y_pred = model.predict(x_log)

3. 排序避免连线混乱

把原始X和对应的预测值按X升序排序,确保连线是连贯的直线:

# 获取排序后的索引
sorted_indices = x.argsort()
# 按索引排序X和预测值
x_sorted = x.iloc[sorted_indices]
y_pred_sorted = y_pred[sorted_indices]

4. 用axes对象绘图

import matplotlib.pyplot as plt

# 创建子图获取axes对象
fig, ax = plt.subplots()

# 画散点图,设置X轴为对数刻度
ax.scatter(x, y)
ax.set_xscale('log')

# 画回归直线
ax.plot(x_sorted, y_pred_sorted, color='red', linewidth=2)

plt.show()

出错根源解释

如果之前直接用原始X拟合y = kx + b,在对数X轴上显示时,直线会被拉伸成曲线;要是没排序,预测值的顺序和X的顺序错位,连线就会交叉形成看起来不规则的线段。另外,一定要用ax.set_xscale('log')来设置对数轴,而不是手动把X转成对数后用普通轴绘图,这样刻度才是正确的对数格式。

可选:用statsmodels拟合

如果习惯用statsmodels包,代码可以这么写:

import statsmodels.api as sm

# 添加截距项,拟合OLS模型
x_log = sm.add_constant(np.log(x))
model = sm.OLS(y, x_log).fit()
y_pred = model.predict(x_log)

# 排序后绘图
sorted_indices = x.argsort()
ax.plot(x.iloc[sorted_indices], y_pred.iloc[sorted_indices], color='green')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:20:35