【问题标题】:How to plot the sound wave, mfcc,and mel spectrogram on a single figure?如何在单个图形上绘制声波、mfcc 和 mel 频谱图?
【发布时间】:2021-08-16 05:38:53
【问题描述】:

我有一个包含多个 wav 文件的文件夹(目前说 4 个)。我想连续绘制 wav、它的 mfcc 和 mel 频谱图,所以最后是一个有 12 个图的图(每行有三个图,因此有四行)。我无法绘制图表,只能提取特征。请有人帮忙解决这个for循环。我的意思是如何使用 subplot 命令以及如何将每个图形存储在循环中。

问候

path=glob.glob('the path having four wav files/*.wav')

for p in path:
    y, sr = librosa.load(p, sr=16000)
    mfcc=librosa.feature.mfcc(y)
    S = librosa.feature.melspectrogram(y, sr)
    fig, ax = plt.subplot(4,3,.....)
    librosa.display.waveplot(y, sr=sr)
    librosa.display.specshow(librosa.power_to_db(S, ref=np.max))
    librosa.display.specshow(mfcc, x_axis="time",y_axis="mel")
    plt.show()

【问题讨论】:

    标签: matplotlib subplot


    【解决方案1】:
    import matplotlib.pyplot as plt
    Arrays=np.random.rand(6,10,10)
    N_figures=Arrays.shape[0]
    for Id in range(1,N_figures+1):
        Array=Arrays[Id-1]
        plt.subplot(N_figures/2,N_figures/3,Id)
        plt.imshow(Array)
    

    您只需要更改 imshow 所需的绘图。因为我没有频谱图文件,所以我使用了随机创建的 NumPy 数组。您的实现不起作用,因为fig, ax = plt.subplot(4,3,.....) 不适合使用。 Fig 和 axs 在函数 plt.subplots 而不是 plt.subplot 中返回。您也可以使用该方法,但在 for 循环之外,然后访问 axs 元素。

    【讨论】:

    • path=glob.glob('E:/....../*.wav') for i in range(0,13): for p in path: y, sr = librosa .load(p, sr=16000) mfcc=librosa.feature.mfcc(y) S = librosa.feature.melspectrogram(y, sr) #fig, ax = plt.subplot() librosa.display.waveplot(y, sr =sr) plt.subplot(12/3,12/4,i+1) librosa.display.specshow(mfcc, x_axis="time",y_axis="mel") plt.subplot(12/3,12/4 ,i+2) librosa.display.specshow(librosa.power_to_db(S)) plt.subplot(12/3,12/4,i+3)
    • 我不知道如何使它看起来像 cmets 中的代码?另外我不知道如何设置这个外循环 i,我认为这是地块的数量。所以我需要 12 个图的 4X3Xi 矩阵。只有第 i 个位置需要正确设置。请指导。
    • 您知道如何仅绘制 1 个频谱图吗?
    • 我做到了,只是轴产生了问题,我尝试了轴(关闭)但对我不起作用。
    • 完成使用:[axi.set_axis_off() for axi in ax.ravel()]
    【解决方案2】:

    最终代码为:

    import matplotlib.pyplot as plt
    import librosa
    import librosa.display
    import glob
    
    path=glob.glob('E:/Python_On_All_Dataset/Four emotion_for plot/*.wav') 
    
    fig, ax =  plt.subplots(nrows=4, ncols=3, sharex=True)
    
        
    for i in range(4) :
       
        y, sr = librosa.load(path[i], sr=16000)
        librosa.display.waveplot(y, sr, ax=ax[i, 0])  # put wave in row i, column 0
        plt.axis('off')
        
        
       
        mfcc=librosa.feature.mfcc(y) 
        librosa.display.specshow(mfcc, x_axis='time', ax=ax[i, 1]) # mfcc in row i, column 1
       
    
        S = librosa.feature.melspectrogram(y, sr)
        librosa.display.specshow(librosa.power_to_db(S), x_axis='time', y_axis='log', ax=ax[i, 2])  # spectrogram in row i, column 2
       
    

    尝试放置这个轴(在每次绘图后关闭,但不知何故它不起作用)

    【讨论】:

    • 有人能告诉我如何从所有这些图中删除轴吗?问候
    • 在我的图中,它有效。你有没有把 plt.axis('off') 放在 for 循环的末尾。
    • 是的,先生只是这样做了。你能不能看看代码 sn-p 并告诉我应该在哪里写这个。
    • 紧随 librosa.display.specshow(librosa.power_to_db(S), x_axis='time', y_axis='log', ax=ax[i, 2]) # 第 i 行的频谱图, for 循环末尾的第 2 列行。
    • 不,先生,它不工作。我认为对于 subplots() 它不会起作用。在定义图形规范并完成后,我只使用了一行:[axi.set_axis_off() for axi in ax.ravel()] 你也可以点击这个链接。 stackoverflow.com/questions/25862026/turn-off-axes-in-subplots
    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 2020-03-03
    • 2016-12-09
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多