调整温度异常数据绘图的日期格式与X轴刻度标签
解决Matplotlib日期轴仅显示1970-1975年份的问题
问题背景
用Pandas的read_csv()读取了1881-2022年的月温度异常CSV文件,通过skipfooter=3排除2022年最后3个月的-999无效值,日期格式为yyyy-mm-dd。绘图时X轴每年重复显示12个年份刻度,尝试用YearLocator设置仅按年份显示刻度后,却只出现1970-1975年的年份标签,需要解决这个问题。
问题根源
你的代码里dates列是字符串类型,matplotlib无法直接识别为日期对象,导致YearLocator只能解析到默认的时间纪元(1970年)附近的日期,所以只显示了1970-1975的年份。
修正后的代码
import matplotlib.pyplot as plt import pandas as pd from matplotlib.dates import YearLocator, MonthLocator, DateFormatter import matplotlib.dates as mdates # 读取CSV时直接解析Date列为datetime类型,同时跳过最后3行 ds = pd.read_csv('path_to_file.csv', header='infer', engine='python', skipfooter=3, parse_dates=['Date']) # 关键:自动解析日期列 # 提取日期和温度异常数据(注意列名的空格,建议重命名简化) dates = ds['Date'] tAnoms = ds[' Berkeley Earth 2m Air Temperature (degree C) 0N-90N;0E-360E'] # 可选:给列重命名,后续代码更简洁 # ds.rename(columns={' Berkeley Earth 2m Air Temperature (degree C) 0N-90N;0E-360E': 'temp_anomaly'}, inplace=True) # tAnoms = ds['temp_anomaly'] fig = plt.figure(figsize=(10, 6)) # 调整画布比例更合理 ax = plt.subplot(111) # 绘制原始数据和滚动平均 ax.plot(dates, tAnoms, label='月温度异常') ax.plot(dates, tAnoms.rolling(60, center=True).mean(), label='60个月滚动平均', linewidth=2) # 设置主刻度为每年1月,格式化为年份 ax.xaxis.set_major_locator(mdates.YearLocator(month=1)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y')) # 可选:添加月份次要刻度,增强可读性 ax.xaxis.set_minor_locator(mdates.MonthLocator()) # 添加图例、标题和轴标签 ax.legend() ax.set_ylabel('温度异常 (°C)') ax.set_xlabel('年份') ax.set_title('1881-2022年北半球月温度异常') # 自动旋转X轴标签,避免重叠 plt.xticks(rotation=45) plt.tight_layout() # 调整布局,防止标签被截断 plt.show()
关键修正点
- 读取CSV时添加
parse_dates=['Date'],将字符串格式的日期直接解析为datetime64类型,让matplotlib能正确识别全时段的日期。 - 可选:给过长的温度异常列名重命名,简化代码维护。
- 添加了图例、轴标签和标题,优化图表可读性;旋转X轴标签并使用
tight_layout()避免标签截断。
内容的提问来源于stack exchange,提问作者Chris Turnbull
相关产品推荐
相关产品推荐

