Pywayne Plot — Pywayne 绘图
v0.1.0增强的频谱图可视化工具,用于时间-频率分析。在创建频谱图、谱分析或信号的时间-频率图时使用,包括IMU数据(加速度计、陀螺仪)、生理信号(PPG、ECG、呼吸)、振动分析和音频处理。支持频率单位转换(Hz/bpm/kHz)、多种归一化模式(全局/局部/无)和MATLAB风格的parula colormap。
运行时依赖
安装命令
点击复制技能文档
Pywayne Plot 专业时间频率分析的增强型频谱可视化工具。
快速开始
import matplotlib.pyplot as plt from pywayne.plot import regist_projection, parula_map import numpy as np# 注册自定义投影 regist_projection()
# 创建频谱图 fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'}) spec, freqs, t, im = ax.specgram( x=signal_data, Fs=100, NFFT=128, noverlap=96, cmap=parula_map, scale='dB' ) ax.set_ylabel('Frequency (Hz)') plt.colorbar(im, label='Magnitude (dB)') plt.show()
函数
regist_projection
注册自定义 SpecgramAxes 投影。必须在使用增强型频谱功能之前调用。from pywayne.plot import regist_projection
regist_projection()
SpecgramAxes.specgram
增强型频谱图,具有高级功能。 关键参数:NFFT:FFT 窗口长度(点数),默认 256
Fs:采样频率(Hz),默认 2
noverlap:窗口重叠点数,默认 128
cmap:颜色图(使用 parula_map),默认 None
mode:'psd'、'magnitude'、'angle'、'phase',默认 'psd'
scale:'dB' 或 'linear',默认 'dB'
normalize:'global'、'local'、'none',默认 'global'
freq_scale:频率缩放因子,默认 1.0
Fc:中心频率偏移(Hz),默认 0
返回值:
spec:2D 频谱数组(n_freqs, n_times)
freqs:频率轴数组
t:时间轴数组
im:matplotlib 图像对象(用于颜色条)get_specgram_params
根据信号特性自动推荐 STFT 参数。from pywayne.plot import get_specgram_params
params = get_specgram_params(
signal_length=10000, sampling_rate=100, time_resolution=0.1
)
返回值:
NFFT、noverlap、actual_freq_res、actual_time_res、n_segmentsparula_map
MATLAB 风格的感知统一 colormap,用于科学可视化。from pywayne.plot import parula_map
plt.imshow(data, cmap=parula_map)
用例
IMU 信号分析
fs = 100 # 采样率
win_time, step_time = 1, 0.1
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=acc_data, Fs=fs, NFFT=int(win_time fs), noverlap=int((win_time - step_time) fs), scale='dB', cmap=parula_map
)
ax.set_ylabel('Frequency (Hz)')
ax.set_ylim(0, 30)
生理信号(PPG - 心率)
# 将 Hz 转换为 bpm 以显示心率
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=ppg_signal, Fs=100, NFFT=400, noverlap=300, freq_scale=60, scale='dB'
)
ax.set_ylabel('Heart Rate (bpm)')
ax.set_ylim(40, 180)
振动分析与全局归一化
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=vibration_data, Fs=1000, NFFT=1024, noverlap=512, scale='linear', normalize='global'
)
plt.colorbar(im, label='Normalized Magnitude')
高分辨率分析与零填充
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=signal, Fs=100, NFFT=100, pad_to=512, noverlap=80, scale='dB'
)
缩放和归一化模式
缩放模式
dB:对数(10log10 用于 PSD,20log10 用于 magnitude)
linear:线性幅度归一化模式(仅用于 scale='linear')
global:Z/max(Z),保留相对强度
local:每列归一化到 [0,1]
none:无归一化频率缩放
freq_scale:单位,使用场景
+ 1.0:Hz,默认,大多数信号
+ 60:bpm,心率,呼吸率
+ 0.001:kHz,音频信号
示例:freq_scale=60 将 2 Hz 转换为 120 bpm
分辨率指南
频率分辨率:Δf = Fs / NFFT
时间分辨率:Δt = (NFFT - noverlap) / Fs
权衡:不能同时实现高频率和时间分辨率
使用 get_specgram_params() 自动计算最佳参数
交互式分析
spec, freqs, t, im = ax.specgram(...)
def on_click(event):
if event.xdata and event.inaxes == ax:
time_idx = np.argmin(np.abs(t - event.xdata))
plt.figure()
plt.plot(freqs, spec[:, time_idx])
plt.title(f'FFT at t={event.xdata:.2f}s')
plt.show()
fig.canvas.mpl_connect('button_press_event', on_click)
应用领域 IMU 数据:加速度计和陀螺仪分析 生理信号:PPG(心率)、ECG、呼吸 振动分析:机械故障诊断 音频处理:语音和音频谱分析
注意
始终在使用投影 'z_norm' 之前调用 regist_projection()
推荐使用 parula_map 以获得最佳感知统一性
dB 模式自动处理 log(0) 问题
为提高 FFT 效率,设置 NFFT 为 2 的幂