Есть ли способ построить Imshow Матплотлиба против определенного массива, а не индексов? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь использовать Imshow для построения двумерного преобразования Фурье моих данных. Тем не менее, Imshow строит данные относительно их индекса в массиве. Я хотел бы построить данные для набора массивов, в которых содержатся соответствующие значения частоты (один массив для каждого значения яркости), но не могу понять, как.

У меня есть двумерный массив данных (импульсный гауссов сигнал), который я преобразую Фурье с помощью np.fft.fft2. Это все отлично работает. Затем я получаю соответствующие частотные интервалы для каждого измерения с помощью np.fft.fftfreq (len (data)) * sampling_rate. Я не могу понять, как использовать imshow для отображения данных по этим частотам. 1D эквивалент того, что я пытаюсь сделать, используя plt.plot (x, y), а не просто plt.plot (y).

Моя первая попытка состояла в том, чтобы использовать флаг "экстента" в imshows, но, насколько я могу судить, это лишь изменяет пределы оси, а не фактические ячейки.

Моим следующим решением было использовать np.fft.fftshift, чтобы упорядочить данные в числовом порядке, а затем просто изменить масштаб оси, используя следующий ответ: Изменить масштаб оси imshow . Тем не менее, индекс для частотного интервала не является чистым коэффициентом масштабирования, обычно также существует постоянное смещение.

Моя попытка состояла в том, чтобы использовать 2d hist вместо imshow, но это не сработало, поскольку 2dhist отображает число раз, когда встречается пара ордеров, а я хочу построить скалярное значение, соответствующее конкретным парам ордеров (то есть степень сигнал на определенных частотных комбинациях).

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

f = 200
st = 2500
x = np.linspace(-1,1,2*st)
y = signal.gausspulse(x, fc=f, bw=0.05)

data = np.outer(np.ones(len(y)),y) # A simple example with constant y

Fdata = np.abs(np.fft.fft2(data))**2

freqx = np.fft.fftfreq(len(x))*st # What I want to plot my data      against
freqy = np.fft.fftfreq(len(y))*st

plt.imshow(Fdata) 

Я должен видеть пик в (200,0), соответствующий частоте моего сигнала (с некоторым падением вокруг него, соответствующим ширине полосы), но вместо этого мой максимум возникает в некоторой случайной позиции, соответствующей индексу частоты в моих данных массив. Если у кого-то есть идеи, исправления или другие функции, которые я могу использовать, я буду очень признателен!

1 Ответ

0 голосов
/ 03 июля 2019

Я не могу запустить ваш код, но я думаю, что вы ищете аргумент extent= для imshow().См. страницу на origin и extent для получения дополнительной информации.

Что-то подобное может работать?

plt.imshow(Fdata, extent=(freqx[0],freqx[-1],freqy[0],freqy[-1])) 
...