如何在matplotlib频谱图的横坐标上绘制时间?

时间:2019-05-26 02:38:03

标签: python matplotlib spectrum

我正在尝试绘制以4,000Hz采样的数组(specgram)的my_array。 在此示例中,数据是在2019年5月15日的11分中从08:41到08:52收集的。

我正在使用熊猫从csv文件中提取数据,但是为了创建reprex,我从头开始创建了一个unix时间戳的时间数组(my_times):

import matplotlib.pyplot as plt
import matplotlib.ticker as tick
import datetime
import numpy as np

SR=4000 #sampling rate

my_times = np.arange(1557909700.221257,1557910338.095864,0.00025)
my_array = np.random.rand(my_times.shape[0])

我想绘制频谱图(matplotlib.pyplot.specgram),但我不想代表横坐标上的垃圾箱数量,而是要表示实际时间。

这是我当前的代码,灵感来自this SO post

Pxx, freqs, bins, im=plt.specgram(my_array,Fs=SR, NFFT=8192, scale_by_freq='True', detrend='mean', scale='dB')
ax=plt.gca()
def timeTicks(my_times, pos):                                                                                                                                                                                                                                                         
    return datetime.datetime.utcfromtimestamp(my_times).strftime("%H:%M:%S")                                                                                                                                                                                                                                                                                
formatter = tick.FuncFormatter(timeTicks)   
ax.xaxis.set_major_formatter(formatter) 

plt.ylabel('Frequency (Hz)')
plt.xlabel('Time (hh:mm:ss)')

此代码产生以下图:

enter image description here

我的问题是,此处给出的时间始于00:00。我如何绘制“绝对”时间,即 我的绘制从08:42开始?

我不太了解FuncFormatter的工作原理。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我最终使用xextent来指定沿x轴参数的图像范围。我将时间数组(my_times[0])的第一个样本指定为 xmin ,最后一个样本(my_times[0])指定为 xmax

Pxx, freqs, bins, im=plt.specgram(my_array,Fs=SR, NFFT=8192, scale_by_freq='True', detrend='mean', scale='dB', xextent=[my_times[0],my_times[-1]])

修改代码将产生以下图像:

enter image description here