numpy 尝试使用matplotlib库显示颜色条时出错Python 3.9

xzv2uavs  于 2023-03-08  发布在  Python
关注(0)|答案(1)|浏览(188)

我目前正在学习使用librosa库,当我试图在一个相关的谱图上显示一个颜色条时,我得到了一个无法解释的错误。我对matplotlib不太熟悉,我到处寻找解决方案,我不禁觉得我在这里错过了一些东西。
下面的代码:

n_fft = 2048 #number of samples (window of performing an FFT)
hop_length = 512 #amount shifting each fourier transform to the right

stft = librosa.core.stft(signal, hop_length=hop_length, n_fft=n_fft)

spectogram = np.abs(stft)

log_spectogram = librosa.amplitude_to_db(spectogram)

librosa.display.specshow(log_spectogram, sr=sr, hop_length=hop_length)
plt.xlabel("Time")
plt.ylabel("Frequency")
plt.colorbar()
plt.show()

导致属性错误:

AttributeError: module 'matplotlib' has no attribute 'axes'. Did you mean: 'axis'?

但是如果我把线去掉

plt.colorbar()

我得到了下面的结果,这是可以的,但我真的需要颜色条。
SpectrogramNoColorBar
我需要这个:
SpectrogramWithColorBar
我尝试使用面向对象的界面来显示librosa文档中的声谱图:https://librosa.org/doc/main/auto_examples/plot_display.html,但没有成功。
请帮帮我。
编辑:下面是我的脚本的完整代码:

import librosa, librosa.display
import matplotlib.pyplot as plt
import numpy as np

file = "Audio_ML\\blues_sample.wav"
#waveform
#loading the audio file with sample rate=22050(fine for audio data)
signal, sr = librosa.load(file, sr=22050) # -> signal(numpy array) containing sr*T -> 22050 * 96
# librosa.display.waveshow(signal, sr=sr)
# plt.xlabel("Time")
# plt.ylabel("Amplitude")
# plt.show()

#FTT -> spectrum (FAST FOURIER TRANSFORM TO GO FROM TIME DOMAIN TO FREQUENCY DOMAIN)
fft = np.fft.fft(signal)

magnitude = np.abs(fft) #magnitudes of each frequency
frequency = np.linspace(0, sr, len(magnitude))

left_frequency = frequency[:int(len(frequency)/2)]
left_magnitude = magnitude[:int(len(frequency)/2)]

# plt.plot(left_frequency, left_magnitude)
# plt.xlabel("Frequency")
# plt.ylabel("Magnitude")
# plt.show()

#STFT -> spectogram (SHORT TIME FOURIER TRANSFORM)
n_fft = 2048 #number of samples (window of performing an FFT)
hop_length = 512 #amount shifting each fourier transform to the right

stft = librosa.core.stft(signal, hop_length=hop_length, n_fft=n_fft)

spectogram = np.abs(stft)

log_spectogram = librosa.amplitude_to_db(spectogram)

librosa.display.specshow(log_spectogram, sr=sr, hop_length=hop_length)
plt.xlabel("Time")
plt.ylabel("Frequency")
plt.colorbar()
plt.show()

#MFCCs
MFCCs = librosa.feature.mfcc(y=signal, n_fft=n_fft, hop_length=hop_length, n_mfcc=13)

我使用的是matplotlib 3.7和librosa 0.10.0

blmhpbnm

blmhpbnm1#

这个问题似乎与matplotlib的最新版本有关。我设法通过使用以下命令将matplotlib 3.7.0降级到matplotlib 3.6.0来解决这个问题

pip install matplotlib==3.6.0

这样做后我得到了想要的colorbar。
谢谢你的帮助!

相关问题