删除Matplotlib中数据点周围的填充

时间:2018-05-14 12:18:08

标签: python matplotlib

我对Pyplot很新,我试图将音频文件的Raw波与其频谱图一起绘制。我编写了以下代码并收到了下面屏幕截图中显示的结果(代码略有缩写以便于阅读):

fig = plt.figure(figsize=(14, 8))

sample_rate, audio = ...  # rate and wave data loaded with scipy.io.wavfile.read
show_wave(audio, sample_rate, fig)

freqs, times, spec = ... # spectrogram created with scipy.signal.spectrogram
show_spectrogram(freqs, times, spec, fig)

def show_wave(audio, sample_rate, fig):
    ax1 = fig.add_subplot(211)
    title = ... # some title created dynamically
    ax1.set_title(title)
    ax1.set_ylabel('Amplitude')
    ax1.set_xlabel('Audio frames')
    ax1.plot(np.linspace(0, len(audio), len(audio)), audio)
    return ax1

def show_spectrogram(freqs, times, spec, fig):
    ax2 = fig.add_subplot(212)
    extent = [times.min(), times.max(), freqs.min(), freqs.max()]
    ax2.imshow(spec.T, aspect='auto', origin='lower', extent=extent)
    ax2.set_yticks(freqs[::16])
    ax2.set_xticks(times[::int(len(times)/10)])
    ax2.set_title(...) # some title created dynamically
    ax2.set_ylabel('Freqs in Hz')
    ax2.set_xlabel('Seconds')
    return ax2, extent  

我想显示两个堆积的图,这样我就可以将原始波与其频谱图进行比较。但是,使用ax1.plot(...)创建的绘图似乎在数据点的左侧和右侧添加了一些填充(零刻度不在轴的原点,数据点不跨越整个可用区域)而使用ax2.imshow创建的绘图不会这样做(绘图横跨整个区域)。

如何删除ax1.plot中的“填充”,以便原始波和频谱图中的数据点垂直对齐并具有可比性?

Raw wave and spectrogram of audio file

2 个答案:

答案 0 :(得分:1)

使用ax1.set_xlim(0, len(audio))强制xaxis的边界从0变为len(audio)这是您的数据实际跨越的范围,这将消除"填充"你看。

答案 1 :(得分:0)

OP的解决方案无法解决:

正如Julien Marrec在下面指出的那样,解决方案很简单:在show_waveshow_spectrogram中添加以下行,它完美运行......

def show_wave(...)
  ...
  ax1 = fig.add_subplot(211)
  ax1.set_xlim(0, len(audio))
  ...

def show_spectrogram(...)
  ...
  ax2 = fig.add_subplot(212)
  ax2.set_xlim(0, times.max())
  ...