使用plt.specgram绘制频谱图时,设置日期格式化器后日期偏移至1970的解决方法
解决plt.specgram频谱图x轴日期显示为1970年的问题
问题场景
使用plt.specgram绘制时间范围为2005-2007的数据集频谱图时,设置x轴日期格式化器和定位器后,图表x轴日期却变成了1970年。
代码示例
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates df=pd.read_csv('Data.csv') df.Date=pd.to_datetime(df.Date) df=df.set_index('Date') plt.figure(figsize=(20,10)) plt.specgram(df, Fs=1) plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))
数据样例
Date Value 2005-05-01 0.52264 2005-05-02 0.45656 ... ... 2007-02-27 0.558954 2007-02-28 0.679884
问题原因
plt.specgram默认把x轴设成从0开始的样本索引(整数),不是实际的时间戳。当你直接给这个整数轴套日期格式化器时,matplotlib会把这些整数当成UNIX时间戳(从1970-01-01开始的秒数),自然就显示出1970年的日期了。
解决方法
修改后的代码
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates from matplotlib.dates import date2num # 读取并处理数据 df = pd.read_csv('Data.csv') df['Date'] = pd.to_datetime(df['Date']) df = df.set_index('Date') plt.figure(figsize=(20,10)) # 绘制频谱图,同时获取返回的时间轴、频率轴和谱图数据 freqs, times, Sxx = plt.specgram(df['Value'], Fs=1) # 将起始日期转换成matplotlib内部识别的数值格式 start_date_num = date2num(df.index[0]) # 因为Fs=1表示每天一个采样点,times里的数值就是起始日期后的天数,累加得到实际日期的数值 actual_dates_num = start_date_num + times # 获取当前坐标轴,替换x轴刻度为实际日期对应的数值 ax = plt.gca() ax.set_xticks(actual_dates_num) # 设置日期显示格式和3个月间隔的刻度 ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3)) # 旋转x轴标签,避免重叠 plt.xticks(rotation=45) plt.tight_layout() plt.show()
关键细节
- 如果你的采样频率不是1(比如每小时一个采样点,
Fs=24),需要调整日期转换的计算:actual_dates_num = start_date_num + times/24,保证时间增量和实际采样间隔匹配。 date2num的作用是把pandas的datetime对象转换成matplotlib内部用的浮点数(代表从1970-01-01开始的天数),这样才能正确映射到日期轴。
内容的提问来源于stack exchange,提问作者Lover Coffee
相关产品推荐
相关产品推荐

