如何在水平条形图上绘制匹配年份范围的线性回归线
问题原因
你当前训练模型时将S_scores作为自变量、Years作为因变量,绘图时又直接传入原始的S_scores作为x轴输入,导致回归线只能覆盖现有数据对应的年份区间,无法覆盖2000-2020的完整Y轴范围。
修改方案
调整模型训练的自变量与因变量方向,用年份作为输入预测对应S_scores,再生成2000-2020的连续年份序列计算预测值即可,仅需修改两处代码:
- 修改模型训练逻辑:
lr = Ridge() # 调整为用年份预测S_scores lr.fit(regression_STS[['Years']], regression_STS['S_scores'])
- 替换原回归线绘制代码:
# 生成2000到2020的连续年份序列,共100个点保证线条平滑 y_range = np.linspace(2000, 2020, 100) # 预测对应年份的S_scores作为x轴坐标 x_pred = lr.predict(y_range.reshape(-1, 1)) # 绘制覆盖全Y轴区间的回归线 axes[0].plot(x_pred, y_range, color='orange')
如果你不想修改原模型的训练方向,也可以直接通过现有模型的参数反向计算对应年份的S_scores:
y_range = np.linspace(2000, 2020, 100) # 从现有模型(Years = coef * S_scores + intercept)反向推导S_scores x_pred = (y_range - lr.intercept_) / lr.coef_[0] axes[0].plot(x_pred, y_range, color='orange')
修改后完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import Ridge # 假设你的Years、S_scores、S_presidents变量已提前定义 regression_STS = pd.DataFrame({ "Years": Years, "S_scores": S_scores }) lr = Ridge() # 调整训练方向:用年份预测S_scores lr.fit(regression_STS[['Years']], regression_STS['S_scores']) # 绘图部分 fig, axes = plt.subplots(nrows=1, ncols=2, sharey=False, sharex=False) S = axes[0].barh(Years, S_scores, align='center', color=np.where(S_scores < 0, 'red', 'green')) axes[0].set(title='S Score') axes[0].set_xlim(-40, 80) # 替换后的回归线绘制代码 y_range = np.linspace(2000, 2020, 100) x_pred = lr.predict(y_range.reshape(-1, 1)) axes[0].plot(x_pred, y_range, color='orange') rects1 = S.patches for rect, label in zip(S, S_presidents): width = rect.get_width() + 2 label_y_pos = rect.get_y() + rect.get_height() / 2 axes[0].text(width, label_y_pos, s=label, color='blue')
内容的提问来源于stack exchange,提问作者zepcron
相关产品推荐
相关产品推荐

