我正在尝试将色条添加到频谱图中。我已经尝试过我在网上找到的每个例子和问题帖子,但没有人解决过这个问题
请注意' spl1' (数据拼接1)是来自ObsPy的痕迹。
我的代码是:
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) #[left bottom width height]
ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1)
ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6])
t = np.arange(spl1[0].stats.npts) / spl1[0].stats.sampling_rate
ax1.plot(t, spl1[0].data, 'k')
ax,spec = spectrogram(spl1[0].data,spl1[0].stats.sampling_rate, show=False, axes=ax2)
ax2.set_ylim(0.1, 15)
fig.colorbar(spec, cax=ax3)
出现错误:
Traceback (most recent call last):
File "<ipython-input-18-61226ccd2d85>", line 14, in <module>
ax,spec = spectrogram(spl1[0].data,spl1[0].stats.sampling_rate, show=False, axes=ax2)
TypeError: 'Axes' object is not iterable
目前为止的最佳结果:
将上面的最后3行替换为:
ax = spectrogram(spl1[0].data,spl1[0].stats.sampling_rate, show=False, axes=ax2)
ax2.set_ylim(0.1, 15)
fig.colorbar(ax,cax=ax3)
和colorbar的错误:
axes object has no attribute 'autoscale_None'
我似乎无法找到一种方法让右边的颜色条工作。
方案吗
我看到的一个解决方案是你需要创建一个&#39;图像&#39;使用imshow()你的数据,但是我没有从Spectrogram()得到一个输出,只有&#39; ax&#39;。我见过的地方尝试使用&#39; ax,spec&#39;来自spectrogram()的输出但是导致了TypeError。
我希望有人可以帮忙解决这个问题 - 我现在整天都在努力!
答案 0 :(得分:3)
在this link的帮助下解决了这个问题。它还没有显示分贝,但主要问题是获得颜色条:
from obspy.imaging.spectrogram import spectrogram
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) #[left bottom width height]
ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1)
ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6])
#make time vector
t = np.arange(spl1[0].stats.npts) / spl1[0].stats.sampling_rate
#plot waveform (top subfigure)
ax1.plot(t, spl1[0].data, 'k')
#plot spectrogram (bottom subfigure)
spl2 = spl1[0]
fig = spl2.spectrogram(show=False, axes=ax2)
mappable = ax2.images[0]
plt.colorbar(mappable=mappable, cax=ax3)
答案 1 :(得分:0)
我假设您正在使用matplotlib.pyplot。它有明确的颜色要求
matplotlib.pyplot.plot(x-cordinates , y-co-ordinates, color)
示例实现如下。
"""Plots
Time in MS Vs Amplitude in DB of a input wav signal
"""
import numpy
import matplotlib.pyplot as plt
import pylab
from scipy.io import wavfile
from scipy.fftpack import fft
myAudio = "audio.wav"
#Read file and get sampling freq [ usually 44100 Hz ] and sound object
samplingFreq, mySound = wavfile.read(myAudio)
#Check if wave file is 16bit or 32 bit. 24bit is not supported
mySoundDataType = mySound.dtype
#We can convert our sound array to floating point values ranging from -1 to 1 as follows
mySound = mySound / (2.**15)
#Check sample points and sound channel for duel channel(5060, 2) or (5060, ) for mono channel
mySoundShape = mySound.shape
samplePoints = float(mySound.shape[0])
#Get duration of sound file
signalDuration = mySound.shape[0] / samplingFreq
#If two channels, then select only one channel
mySoundOneChannel = mySound[:,0]
#Plotting the tone
# We can represent sound by plotting the pressure values against time axis.
#Create an array of sample point in one dimension
timeArray = numpy.arange(0, samplePoints, 1)
#
timeArray = timeArray / samplingFreq
#Scale to milliSeconds
timeArray = timeArray * 1000
#Plot the tone
plt.plot(timeArray, mySoundOneChannel, color='G')
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.show()
#Plot frequency content
#We can get frquency from amplitude and time using FFT , Fast Fourier Transform algorithm
#Get length of mySound object array
mySoundLength = len(mySound)
#Take the Fourier transformation on given sample point
#fftArray = fft(mySound)
fftArray = fft(mySoundOneChannel)
numUniquePoints = numpy.ceil((mySoundLength + 1) / 2.0)
fftArray = fftArray[0:numUniquePoints]
#FFT contains both magnitude and phase and given in complex numbers in real + imaginary parts (a + ib) format.
#By taking absolute value , we get only real part
fftArray = abs(fftArray)
#Scale the fft array by length of sample points so that magnitude does not depend on
#the length of the signal or on its sampling frequency
fftArray = fftArray / float(mySoundLength)
#FFT has both positive and negative information. Square to get positive only
fftArray = fftArray **2
#Multiply by two (research why?)
#Odd NFFT excludes Nyquist point
if mySoundLength % 2 > 0: #we've got odd number of points in fft
fftArray[1:len(fftArray)] = fftArray[1:len(fftArray)] * 2
else: #We've got even number of points in fft
fftArray[1:len(fftArray) -1] = fftArray[1:len(fftArray) -1] * 2
freqArray = numpy.arange(0, numUniquePoints, 1.0) * (samplingFreq / mySoundLength);
#Plot the frequency
plt.plot(freqArray/1000, 10 * numpy.log10 (fftArray), color='B')
plt.xlabel('Frequency (Khz)')
plt.ylabel('Power (dB)')
plt.show()
#Get List of element in frequency array
#print freqArray.dtype.type
freqArrayLength = len(freqArray)
print "freqArrayLength =", freqArrayLength
numpy.savetxt("freqData.txt", freqArray, fmt='%6.2f')
#Print FFtarray information
print "fftArray length =", len(fftArray)
numpy.savetxt("fftData.txt", fftArray)