Я пытаюсь построить specgram
массива (my_array
) с частотой дискретизации 4000 Гц. В этом примере данные были собраны 15 мая 2019 года в течение 11 минут, с 08:41 до 08:52.
Я извлекаю свои данные из CSV-файла с помощью pandas, но ради создания reprex я создаю временной массив (my_times
) временных меток unix с нуля:
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
), но вместо отображения количества ячеек на абсциссе я хотел бы представить фактическое время.
Это мой текущий код, вдохновленный этой записью SO а>:
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)')
Этот код дает следующий график:
Моя проблема в том, что время, указанное здесь, начинается с 00:00. Как я могу отобразить «абсолютное» время, т.е. чтобы мой график начинался в 08:42?
Я не очень понимаю, как работает FuncFormatter. Любая помощь будет оценена по достоинству!