我对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
中的“填充”,以便原始波和频谱图中的数据点垂直对齐并具有可比性?
答案 0 :(得分:1)
使用ax1.set_xlim(0, len(audio))
强制xaxis的边界从0变为len(audio)
这是您的数据实际跨越的范围,这将消除"填充"你看。
答案 1 :(得分:0)
OP的解决方案无法解决:
正如Julien Marrec在下面指出的那样,解决方案很简单:在show_wave
和show_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())
...