Librosa.display绘制的STFT频谱图弹窗闪现后消失的问题排查
问题与解答
问题描述
参考Librosa官方文档中的示例代码绘制STFT频谱图时,频谱图窗口仅短暂弹出后立刻消失,无法正常显示。请问是否需要显式调用方法来展示代码中的img对象?若不需要,可能是什么原因导致绘图无法正常显示?
问题代码
# 读取.wav文件 audio, sample_rate = librosa.load("/Users/user/Desktop/voice.wav") # 使用librosa执行STFT audio_stft_1000 = np.abs(librosa.stft(audio, n_fft=1000)) audio_stft_3000 = np.abs(librosa.stft(audio, n_fft=3000)) # 根据文档创建绘图 fig, ax = plt.subplots() img = librosa.display.specshow(librosa.amplitude_to_db(audio_stft_1000, ref=np.max), y_axis='log', x_axis='time', ax=ax) ax.set_title('Power spectrogram') fig.colorbar(img, ax=ax, format="%+2.0f dB")
解答
不需要显式调用方法展示img对象——它只是specshow返回的图像句柄,作用是关联色条,和窗口显示完全无关。窗口一闪就消失的核心问题出在:Matplotlib绘图完成后程序直接退出,导致窗口被自动销毁。
解决方法很直接:
- 在代码末尾添加一行
plt.show():这是Matplotlib用来阻塞程序、保持绘图窗口显示的关键命令,没有它的话,绘图任务完成后程序就会立刻结束,窗口自然跟着关闭。 - 如果是在Jupyter Notebook环境中,要确保开头添加了
%matplotlib inline(把图嵌入单元格)或者%matplotlib notebook(支持交互式显示)的魔法命令。
另外还有几个可能的次要原因:
- 检查代码后续是否有提前终止程序的语句,比如
sys.exit()之类的操作。 - 确认Matplotlib的后端配置正常,部分环境默认后端可能不支持窗口显示,可以尝试切换后端,比如添加
plt.switch_backend('TkAgg')(需要先安装对应后端库)。
内容的提问来源于stack exchange,提问作者John Harrington
相关产品推荐
相关产品推荐

