Matplotlib字符串X轴标签绘制趋势线报错求助
解决Matplotlib日期趋势线绘制的报错问题
这个报错的核心原因很直接:numpy.polyfit根本不接受字符串类型的输入!你用的x=["1/2018", ...]是字符串数组,polyfit没法对字符串做线性拟合计算,自然就抛出了类型不匹配的错误。那些教程里用日期标签的,其实都是先把日期转成数值型数据做拟合,最后绘图时再换回日期字符串显示,只是没把这个细节写出来而已。
下面给你一套完整的解决方法,还包含趋势线延伸的实现:
步骤1:准备数值型x用于拟合
我们可以给每个日期分配一个连续的数值索引(比如0,1,2,3对应1-4月),用这个数值数组来做线性拟合:
import pylab import numpy as np # 原始数据 y = [129.000, 128.000, 140.000, 150.000] x_dates = ["1/2018", "2/2018", "3/2018", "4/2018"] # 生成数值型索引,用于拟合 x_num = np.arange(len(x_dates))
步骤2:计算趋势线
现在用数值型的x_num来做polyfit,就不会报错了:
# 线性拟合(degree=1) z = np.polyfit(x_num, y, 1) p = np.poly1d(z) # 输出直线方程 print(f"y={z[0]:.6f}x+({z[1]:.6f})")
步骤3:绘制原始数据和趋势线
绘图时,x轴用原始的日期字符串,这样显示的还是友好的日期标签:
# 绘制原始数据点 pylab.plot(x_dates, y, 'o', label='原始数据') # 绘制趋势线(用x_num计算p(x),但x轴用x_dates) pylab.plot(x_dates, p(x_num), "r--", label='趋势线')
步骤4:延伸趋势线到现有日期之外
如果要把趋势线延伸到比如5/2018、6/2018,只需要扩展数值索引和日期列表:
# 扩展数值索引和日期 extended_x_num = np.arange(len(x_dates)+2) # 增加2个点 extended_x_dates = x_dates + ["5/2018", "6/2018"] # 绘制延伸后的趋势线 pylab.plot(extended_x_dates, p(extended_x_num), "b:", label='延伸趋势线')
最后完善绘图
加上图例、标题等,让图表更清晰:
pylab.legend() pylab.title('价格随日期变化趋势') pylab.xlabel('日期') pylab.ylabel('价格') pylab.show()
为什么时间戳没解决?
如果之前尝试时间戳没成功,大概率是转换时没得到正确的数值类型(比如不小心转成了字符串,或者时间戳单位不对)。用上面的数值索引方法更简单,尤其适合这种连续的月份/日期序列,不需要处理复杂的时间格式转换。
内容的提问来源于stack exchange,提问作者Grant Zukel
相关产品推荐
相关产品推荐

