将彩条添加到频谱图

我正在尝试将彩条添加到谱图。 我已经尝试了我在网上找到的每个示例和问题线索,但都没有解决此问题

请注意'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)

产生这个: 波形和谱图

并为颜色条的这个错误:

axes object has no attribute 'autoscale_None'

我似乎无法找到一种方法让工具栏上的彩条显示。

解决方案?

我看到的一个解决方案是,您需要使用imshow()创建数据的“图像”,但是我没有从Spectrogram()获得输出,只有'ax'。 我已经看到一些地方尝试使用spectrogram()的'ax,spec'输出,但是这导致了TypeError。

  • 非常类似的代码,我发现但没有工作https://www.nicotrebbin.de/wp-content/uploads/2012/03/bachelorthesis.pdf(ctrl + f'colorbar')
  • 看一看相关问题的代码示例
  • imshow()建议和示例 - 无法从光谱图获取输出以变成图像。 第二个链接,我也无法让mlpy模块工作(它不认为有mlpy.wavelet函数)
  • 这个问题是在一个改进后的obspy中解决的,但是他说他找到的解决方案没有给出
  • 我希望有人能够帮助我 - 这一天我一直在努力!


    解决它,在这个链接的帮助下。 它不显示分贝,但主要问题是获取色条:

    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)
    

    产生的数字


    我假设你正在使用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)
    

    在这里输入图像描述在这里输入图像描述

    链接地址: http://www.djcxy.com/p/32183.html

    上一篇: Adding Colorbar to a Spectrogram

    下一篇: cache for *just* a subdirectory?