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

