如何在 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 谱图的横坐标上绘制时间?的主要内容,如果未能解决你的问题,请参考以下文章