我有一个包含多个wav文件的文件夹(目前是4个)。我想在一行中绘制wav,它的mfcc和mel频谱图,所以最后是一个有12个图形的图形(每行有3个图形,因此是4行)。我无法绘制图表,只能提取特征。有人可以帮助这个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()发布于 2021-08-17 04:49:35
最后的代码是:
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我试着把这个轴(在每次绘图后都关闭,但不知何故不起作用)

发布于 2021-08-16 10:00:58
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 not for中返回,plt.subplot.You也可以使用该方法,但在for循环之外,然后访问axs元素。
https://stackoverflow.com/questions/68797840
复制相似问题