Удалить заполнение вокруг точек данных в Matplotlib - PullRequest
0 голосов
/ 14 мая 2018

Я довольно новичок в Pyplot, и я пытаюсь построить волну необработанного аудио-файла вместе с его спектрограммой.Я написал следующий код и получил результат, показанный на скриншоте ниже (код немного сокращен для удобства чтения):

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 голосов
/ 14 мая 2018

Решение ОП отредактировано вне вопроса:

Как указал Жюльен Маррек ниже, решение простое: добавьте следующую строку в 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())
  ...
0 голосов
/ 14 мая 2018

Используйте ax1.set_xlim(0, len(audio)), чтобы заставить границы xaxis переходить от 0 к len(audio), что на самом деле охватывает ваши данные, что устранит "заполнение", которое вы видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...