Python线性回归图表日期间隔设为3天的代码修改及错误修复
问题解决与代码修改
报错原因分析
plt.show()调用时机错误:plt.show()会释放当前绘图资源,之后调用plt.gca()会创建新的空白坐标轴,导致设置边界时出现维度错误。- 日期范围与实际数据不匹配:代码中
set_xbound用了2020年的日期,但实际数据是2022年的,逻辑矛盾。 - 线性回归输入类型错误:
LinearRegression不能直接处理datetime类型数据,需要转换为数值型(如时间戳)。 - 日期间隔设置不符合需求:代码里设的是15天,而需求是每3天显示一次。
修改后的完整代码
import pandas as pd from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt import matplotlib.dates as mdates dict_data_confirm = { '2022-01-30': 50, '2022-01-31': 152, '2022-02-01': 41, '2022-02-02': 50, '2022-02-03': 50, '2022-02-04': 50, '2022-02-05': 50, '2022-02-06': 50, '2022-02-07': 50, '2022-02-08': 50, '2022-02-09': 50, '2022-09-30': 50 } # 数据整理 df = pd.Series(dict_data_confirm, name='Amount').rename_axis('Date').reset_index() df['Date'] = pd.to_datetime(df['Date']) # 线性回归处理:将日期转换为时间戳数值 df['timestamp'] = df['Date'].astype('int64') // 10**9 # 转成秒级时间戳 x = df[['timestamp']] y = df['Amount'] lr = LinearRegression() lr.fit(x, y) # 绘图 plt.figure(figsize=(10,6)) plt.scatter(df['Date'], y, color='black') # 生成回归线的预测值,用原始日期做x轴显示 pred_y = lr.predict(x) plt.plot(df['Date'], pred_y, color='blue', linewidth=1) # 设置x轴日期格式与间隔 plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%y-%m-%d')) plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=3)) # 每3天显示一个刻度 plt.gca().xaxis.set_tick_params(rotation=30) # 设置图表标题与坐标轴标签 plt.title('Purchase Data') plt.ylabel('Amount') plt.xlabel('Date') # 设置x轴边界(匹配实际数据范围) plt.gca().set_xbound(df['Date'].min(), df['Date'].max()) # 最后调用show显示图表 plt.tight_layout() # 自动调整布局,避免标签被截断 plt.show()
关键修改点说明
- 调整
plt.show()位置:把所有坐标轴设置、格式调整放在plt.show()之前,确保操作的是当前绘图的坐标轴。 - 日期转数值用于回归:将datetime类型转换为时间戳(整数),作为线性回归的输入特征,解决模型无法处理日期类型的问题。
- 修正日期间隔:把
DayLocator(interval=15)改为interval=3,实现每3天显示一个刻度的需求。 - 匹配数据的日期边界:用数据的最小和最大日期设置x轴边界,避免硬编码错误的年份。
- 添加
tight_layout():自动调整图表布局,防止旋转后的x轴标签被截断。
内容的提问来源于stack exchange,提问作者William Page
相关产品推荐
相关产品推荐

