如何绘制两个WAV文件的频谱子图?颜色条设置与图幅调整
解决WAV频谱图并排展示的两个问题
一、先修正原代码的核心错误
你当前代码里有个关键问题:两个子图用的是同一个S_dB(仅对应最后加载的音频),导致两张图显示完全一样。需要分别处理两个音频的梅尔频谱:
# 处理无说话音频 y_no_speak, sr = librosa.load(FILE_NO_SPEAKING) mel_spec_no_speak = librosa.feature.melspectrogram(y=y_no_speak, sr=sr) S_dB_no_speak = librosa.power_to_db(mel_spec_no_speak, ref=np.max) # 处理有说话音频 y_speak, sr = librosa.load(FILE_SPEAKING) mel_spec_speak = librosa.feature.melspectrogram(y=y_speak, sr=sr) S_dB_speak = librosa.power_to_db(mel_spec_speak, ref=np.max)
二、放大绘图整体尺寸
创建子图时,通过figsize参数直接设置画布宽高(数值越大,图的尺寸越大):
# 示例:宽16,高6的画布,1行2列子图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
三、配置颜色条
有两种实用方案可选:
方案1:每个子图单独配颜色条
分别为两个子图绑定颜色条,需要传入specshow返回的图像对象:
# 绘制无说话频谱图并加颜色条 img_no_speak = librosa.display.specshow(S_dB_no_speak, x_axis='time', y_axis='mel', sr=sr, fmax=8000, ax=ax1) fig.colorbar(img_no_speak, ax=ax1, format='%+2.0f dB') # 绘制有说话频谱图并加颜色条 img_speak = librosa.display.specshow(S_dB_speak, x_axis='time', y_axis='mel', sr=sr, fmax=8000, ax=ax2) fig.colorbar(img_speak, ax=ax2, format='%+2.0f dB')
方案2:共享一个颜色条(更适合对比)
如果两个音频的分贝范围一致,共享颜色条能让对比更直观,把颜色条放在两个子图右侧:
# 绘制两个频谱图 img_no_speak = librosa.display.specshow(S_dB_no_speak, x_axis='time', y_axis='mel', sr=sr, fmax=8000, ax=ax1) img_speak = librosa.display.specshow(S_dB_speak, x_axis='time', y_axis='mel', sr=sr, fmax=8000, ax=ax2) # 绑定到两个子图,共享颜色条 fig.colorbar(img_speak, ax=[ax1, ax2], format='%+2.0f dB')
完整修正后的代码
import librosa import librosa.display import numpy as np import matplotlib.pyplot as plt # 替换为你的实际文件路径 FILE_NO_SPEAKING = "no_speaking.wav" FILE_SPEAKING = "speaking.wav" # 加载并处理音频 y_no_speak, sr = librosa.load(FILE_NO_SPEAKING) mel_spec_no_speak = librosa.feature.melspectrogram(y=y_no_speak, sr=sr) S_dB_no_speak = librosa.power_to_db(mel_spec_no_speak, ref=np.max) y_speak, sr = librosa.load(FILE_SPEAKING) mel_spec_speak = librosa.feature.melspectrogram(y=y_speak, sr=sr) S_dB_speak = librosa.power_to_db(mel_spec_speak, ref=np.max) # 创建指定尺寸的画布 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6)) # 绘制第一个子图 img_no_speak = librosa.display.specshow(S_dB_no_speak, x_axis='time', y_axis='mel', sr=sr, fmax=8000, ax=ax1) fig.colorbar(img_no_speak, ax=ax1, format='%+2.0f dB') ax1.set(title='No Speak') # 绘制第二个子图 img_speak = librosa.display.specshow(S_dB_speak, x_axis='time', y_axis='mel', sr=sr, fmax=8000, ax=ax2) fig.colorbar(img_speak, ax=ax2, format='%+2.0f dB') ax2.set(title='Speak') # 调整布局避免标签重叠 plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者user3668129
相关产品推荐
相关产品推荐

