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

Posted

技术标签:

【中文标题】如何在 matplotlib 谱图的横坐标上绘制时间?【英文标题】:How to plot times on the abscissa of a matplotlib specgram? 【发布时间】:2019-05-26 02:38:03 【问题描述】:

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

我正在使用 pandas 从 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),但我不想在横坐标上显示 bin 的数量,而是表示实际时间。

这是我目前的代码,灵感来自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)')

此代码产生以下图:

我的问题是这里给出的时间从 00:00 开始。如何绘制“绝对”时间,我的绘图从 08:42 开始?

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

【问题讨论】:

尝试使用this答案中的方法 感谢您的建议,谢尔多。我会检查一下。 我找到了解决问题的另一种方法,但再次感谢您的帮助,Sheldore! 【参考方案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]])

修改代码得到以下图像:

【讨论】:

以上是关于如何在 matplotlib 谱图的横坐标上绘制时间?的主要内容,如果未能解决你的问题,请参考以下文章

在 python matplotlib 中绘制 (x, y) 坐标列表

如何使用 matplotlib 创建子图的大图?

python+matplotlib绘制具有多个子图的图表

python+matplotlib绘制具有多个子图的图表

python+matplotlib绘制具有多个子图的图表

Matplotlib库