使用Python绘制目标样式频谱图求助:pcolormesh绘制结果异常
频谱图绘制修正方案
你的问题不是pcolormesh函数的问题,而是缺少功率谱的分贝转换及配色、细节调整,以下是匹配目标效果的代码:
from scipy.signal import spectrogram import matplotlib.pyplot as plt import numpy as np # 计算原始频谱 f, t, Sxx = spectrogram(sound, sample_rate) # 转换为分贝刻度(解决线性功率无法体现明暗对比的问题) Sxx_dB = 10 * np.log10(Sxx + 1e-10) # 加极小值避免log(0)报错 # 绘制频谱图 plt.pcolormesh(t, f, Sxx_dB, cmap='viridis') # viridis配色接近目标图的深色风格 plt.ylabel('Frequency (Hz)') plt.ylim(top=500) plt.xlabel('Time (s)') plt.colorbar(label='Power (dB)') # 添加颜色条对应分贝值,匹配目标图的标注 plt.show()
核心调整说明:
- 分贝转换:目标图的颜色是对数刻度的分贝值,线性的
Sxx无法呈现低频强、高频弱的明暗对比,转换后才能对齐视觉效果。 - 配色选择:默认配色和目标图差异大,
viridis/inferno这类配色更接近目标图的深色系表现。 - 容错处理:
+1e-10防止频谱中出现0值导致对数计算报错。
如果目标图的频率轴是对数刻度,额外添加:
plt.yscale('log') plt.ylim(bottom=20, top=500) # 适配对数刻度的范围
内容的提问来源于stack exchange,提问作者user19756157
相关产品推荐
相关产品推荐

