Используя matplotlib.pyplot, у меня есть два графика. Один из них представляет собой сигнал аудиофайла. Вторая - спектрограмма одного и того же звука. Я хочу, чтобы форма волны была непосредственно над спектрограммой (такая же ось X и выровнялась вместе). Я также хочу использовать цветную панель для спектрограммы.Сделать matplotlib.pyplot диапазон цветовых полос двумя рядами вдоль формы волны и specgram
Проблема: когда я помещаю цветную панель, она присоединяется к ряду спектрограмм, и форма волны распространяется по цветной панели (т. Е. Больше не выравнивается по времени со спектрограммой и шире, чем спектрограмма).
Я близка к решению, я думаю, но я просто не могу понять, что я делаю неправильно или что изменить, чтобы заставить его работать так, как я хочу. Надеюсь, кто-то может указать мне в правильном направлении!
Используя следующий код питона (я сделал код как MWE как можно):
import matplotlib
matplotlib.use("TkAgg")
from scipy.io import wavfile
from matplotlib import mlab
from matplotlib import pyplot as plt
import numpy as np
from numpy.lib import stride_tricks
samplerate, data = wavfile.read('FILENAME.wav')
times = np.arange(len(data))/float(samplerate)
plt.close("all")
####
#Waveform
####
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(13.6, 7.68))
plt.subplot(211)
plt.plot(times, data, color='k')
plt.xlabel('time (s)')
plt.xlim(times[0], times[-1])
max_amp = max(abs(np.amin(data)), abs(np.amax(data)))
min_amp = (max_amp * -1) - abs(np.amin(data) - np.amax(data))/50
max_amp = max_amp + abs(np.amin(data) - np.amax(data))/50
plt.ylim(min_amp, max_amp)
ax = plt.gca()
ax.set_yticks(np.array([min_amp, min_amp/2, 0, max_amp/2, max_amp]))
ax.spines['bottom'].set_position('center')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('none')
ax.yaxis.set_ticks_position('none')
ax.xaxis.set_tick_params(pad=115)
####
#Spectrogram
####
Fs = 5000*2.#10000.
NFFT = min(512, len(data))
noverlap = NFFT/2
pad_to = NFFT * 16
dynamicRange = 27.5
vmin = 20*np.log10(np.max(data)) - dynamicRange
cmap = plt.get_cmap('inferno')
plt.subplot(212)
Pxx, freqs, times, cax = plt.specgram(data, NFFT=NFFT, Fs=samplerate, noverlap=noverlap, mode='magnitude', scale='dB', vmin=vmin, pad_to=pad_to, cmap=cmap)
axes_spec = plt.gca()
axes_spec.set_xlim([0., max(times)])
axes_spec.set_ylim([0, 5000])
plt.xlabel("Time (s)")
plt.ylabel("Frequency (hz)")
plt.colorbar(cax, label='(dB)').ax.yaxis.set_label_position('left')
plt.tight_layout()
plt.show()
я могу получить следующий сюжет:
Делая эти незначительные изменения ниже, я может получить участок, чтобы посмотреть почти как я хочу. Проблема в том, что она создает пустую цифру рядом с цветной панелью. Эта версия, минус пустая цифра, является тем, что я пытаюсь создать.
#Replace this for waveform
plt.subplot(221)
#Replace this for spectrogram
plt.subplot(223)
#Add this before colorbar
plt.subplot(122)
Новая версия сюжета:
EDIT: (! Или, возможно, и для хорошей мерой) Существует еще одна возможность, что я также хорошо с
Вы видели эти ответы: http://stackoverflow.com/questions/13784201/matplotlib-2-subplots-1-colorbar –
Да, но я не мог понять, как адаптировать это к этой ситуации. Я сделал много попыток включить подобные вещи из Интернета и вопросы здесь, но спектрограмма меня немного смущает, как включить ее в другую неспектрограмму. – whatisit
Когда я пытаюсь использовать метод, указанный в ответе на эту ссылку, @ pablo-reyes, тогда я получаю это изображение: [два сюжета, перекрывающие цветную полосу] (http://imgur.com/a/uT9C3) – whatisit