Как изобразить время на абсциссе спекулята matplotlib? - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь построить specgram массива (my_array) с частотой дискретизации 4000 Гц.В этом примере данные были собраны 15 мая 2019 года в течение 11 минут, с 08:41 до 08: 52.

Я извлекаю свои данные из файла CSV, используя панд, но ради создания представ , я создаю временной массив (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)')

Этот код дает следующий график:

enter image description here

Моя проблема в том, что приведенное здесь время начинается в 00:00.Как я могу построить «абсолютное» время, когда у , т.е. мой график начинается в 08:42?

Я не совсем понимаю, как работает FuncFormatter.Любая помощь будет оценена!

1 Ответ

0 голосов
/ 27 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...