如何在Jupyter Notebook中保存MFCC频谱图时不显示对应绘图
解决Jupyter Notebook保存MFCC频谱图时不显示绘图的方案
Jupyter Notebook默认开启了matplotlib的inline显示模式,只要创建画布就会自动在输出区渲染图像,不需要显式调用plt.show(),所以仅调用plt.savefig依然会触发图像显示。你可以参考以下修正后的实现方案:
import librosa import librosa.display import matplotlib.pyplot as plt # 读取音频 x, sr = librosa.load(file_name, sr=sr) # 提取MFCC特征 mfcc_feature = librosa.feature.mfcc(y=x, sr=sr) # 创建画布和坐标系,修复原代码ax未定义的bug fig, ax = plt.subplots(figsize=(12,8)) # 绘制MFCC频谱图 librosa.display.specshow(mfcc_feature, sr=sr, y_axis='linear', ax=ax) # 隐藏坐标轴和边框 ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) ax.set_frame_on(False) ax.set_xlabel(None) ax.set_ylabel(None) # 保存图像,bbox_inches和pad_inches参数可去除多余白边 plt.savefig('mfcc_image.png', bbox_inches='tight', pad_inches=0) # 核心:关闭当前画布,阻止Jupyter渲染显示 plt.close()
关键改动说明:
- 修复原代码bug:原代码仅创建了
fig对象没有获取对应的ax坐标系对象,后续操作ax的代码会直接报错,修正为用plt.subplots同时创建画布和坐标系,绘图时指定ax=ax把图画到对应坐标系上。 - 新增
plt.close()语句:在调用plt.savefig之后执行plt.close(),会直接销毁当前创建的画布对象,Jupyter就不会再把这个画布渲染到输出区,这是兼容性最高的实现方案,不会影响其他单元格的绘图功能。 - 如果需要批量生成大量图片不想每次都写
plt.close(),可以在代码块最开头关闭交互模式:
后续需要恢复正常绘图显示时,调用plt.ioff()plt.ion()即可。
内容的提问来源于stack exchange,提问作者anonymous_abhi
相关产品推荐
相关产品推荐

