Базовое построение результатов вейвлет-анализа в matplotlib

Я открываю вейвлеты на практике благодаря модулю Python Pywt.

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

Это то, что я пытался, (учитывая один топор pyplot ax):

import pywt

data_1_dimension_series = [0,0.1,0.2,0.4,-0.1,-0.1,-0.3,-0.4,1.0,1.0,1.0,0] 
# indeed my data_1_dimension_series is much longer

cA, cD = pywt.dwt(data_1_dimension_series, 'haar')

ax.set_xlabel('seconds')
ax.set_ylabel('wavelet affinity by scale factor')

ax.plot(axe_wt_time, zip(cA,cD))

или также

data_wt_analysis = pywt.dwt(data_1_dimension_series, 'haar')
ax.plot(axe_wt_time, data_wt_analysis) 

И то и другое ax.plot(axe_wt_time, data_wt_analysis) а также ax.plot(axe_wt_time, zip(cA,cD)) не подходят и возвращает ошибку. Оба броска x and y must have the same first dimension

Дело в том data_wt_analysis содержит несколько рядов 1D, по одному на каждый масштабный коэффициент вейвлета. Конечно, я мог бы отображать столько графиков, сколько есть масштабных коэффициентов. Но я хочу, чтобы они все были в одном графике.

Как я могу просто отобразить такие данные, только в одном графике, с помощью matplotlib?

Что-то вроде цветного квадрата ниже:

1 ответ

Решение

Вы должны извлечь различные серии 1D из интересующего вас массива и использовать matplotlib, как в самом простом примере.

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()

из док.

Вы хотите наложить одномерные графики (или линейные графики). Итак, если у вас есть списки l1, l2, l3, вы будете делать

import matplotlib.pyplot as plt
plt.plot(l1)
plt.plot(l2)
plt.plot(l3)
plt.show()

Для скалограммы: что я использовал imshow(), Это было не для вейвлетов, а того же идентификатора: цветовой карты.

Я нашел этот образец для использования imshow() с вейвлетами, не пробовал мысли

from pylab import *
import pywt
import scipy.io.wavfile as wavfile

# Find the highest power of two less than or equal to the input.
def lepow2(x):
    return 2 ** floor(log2(x))

# Make a scalogram given an MRA tree.
def scalogram(data):
    bottom = 0

    vmin = min(map(lambda x: min(abs(x)), data))
    vmax = max(map(lambda x: max(abs(x)), data))

    gca().set_autoscale_on(False)

    for row in range(0, len(data)):
        scale = 2.0 ** (row - len(data))

        imshow(
            array([abs(data[row])]),
            interpolation = 'nearest',
            vmin = vmin,
            vmax = vmax,
            extent = [0, 1, bottom, bottom + scale])

        bottom += scale

# Load the signal, take the first channel, limit length to a power of 2 for simplicity.
rate, signal = wavfile.read('kitten.wav')
signal = signal[0:lepow2(len(signal)),0]
tree = pywt.wavedec(signal, 'db5')

# Plotting.
gray()
scalogram(tree)
show()
Другие вопросы по тегам