Matplotlib绘制30年月度PMI折线图呈方块状的问题与优化
问题分析与解决方法
核心原因:不是格式问题,是数据未按时间排序
你看到的“方块状”折线,本质是Date列未按时间顺序排列。Matplotlib会严格按照数据框里的行顺序连接每个数据点,当日期乱序时,折线会在早、晚日期之间反复跳转,形成尖锐的块状线条,而非数据未完整呈现。
解决步骤
1. 先对数据按日期排序(必做)
先将数据框按Date列升序排列,确保数据点按时间顺序连接:
# 生成排序后的新数据框(推荐,不修改原数据) pmi_sorted = pmi.sort_values('Date') # 或者直接修改原数据框 # pmi.sort_values('Date', inplace=True)
然后用排序后的数据绘图:
plt.plot(pmi_sorted.Date, pmi_sorted.PMI, c='mediumblue', lw=0.8) plt.show()
排序后折线会恢复正常的时间趋势,不再出现方块状。
2. 可选:生成平滑折线(视觉优化)
如果想要更平滑的视觉效果(月度数据本身是离散观测,平滑仅为美化),可以用插值方法生成连续曲线:
import numpy as np from scipy.interpolate import make_interp_spline from datetime import datetime # 先执行第一步的排序 pmi_sorted = pmi.sort_values('Date') # 将日期转换为Matplotlib可处理的数值格式 x_num = pmi_sorted.Date.apply(lambda x: x.toordinal()) # 创建三次样条插值函数 spline = make_interp_spline(x_num, pmi_sorted.PMI, k=3) # 生成更多的时间点用于绘制平滑曲线 x_smooth = np.linspace(x_num.min(), x_num.max(), 1000) # 计算平滑后的PMI值 y_smooth = spline(x_smooth) # 将数值转回日期格式 date_smooth = [datetime.fromordinal(int(x)) for x in x_smooth] # 绘制平滑曲线 plt.plot(date_smooth, y_smooth, c='mediumblue', lw=0.8) plt.show()
内容的提问来源于stack exchange,提问作者maikoh
相关产品推荐
相关产品推荐

