Как отобразить время на абсциссе спектрограммы matplotlib?

Я пытаюсь построить 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. Любая помощь будет оценена по достоинству!


person Sheldon    schedule 26.05.2019    source источник
comment
Попробуйте использовать подход из этого ответа.   -  person Sheldore    schedule 26.05.2019
comment
Спасибо за твое предложение, Шелдор. Я проверю это.   -  person Sheldon    schedule 27.05.2019
comment
Я нашел другой способ обойти свою проблему, но еще раз спасибо за вашу помощь, Шелдор!   -  person Sheldon    schedule 27.05.2019


Ответы (1)


В итоге я использовал 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]])

Изменение кода дало следующее изображение:

введите здесь описание изображения

person Sheldon    schedule 27.05.2019