有没有一种方法可以将Matplotlib的Imshow绘制到特定数组而不是索引上?

时间:2019-07-03 18:42:46

标签: python numpy matplotlib 2d fft

我正在尝试使用Imshow绘制我的数据的二维傅立叶变换。但是,Imshow会根据数组中的索引绘制数据。我想针对一组数组绘制数据,这些数组包含对应的频率值(每个暗淡对应一个数组),但不知道如何。

我有一个二维数据数组(高斯脉冲信号),我用np.fft.fft2进行了傅里叶变换。这一切都很好。然后,我使用np.fft.fftfreq(len(data))* sampling_rate获取每个维度的相应频率仓。我无法弄清楚如何使用imshow针对这些频率绘制数据。一维等效于我尝试使用plt.plot(x,y)而不是仅仅使用plt.plot(y)。

我的第一个尝试是使用imshows“ extent”标志,但是据我所知,只是改变了轴限制,而不是实际的bin。

我的下一个解决方案是使用np.fft.fftshift按数字顺序排列数据,然后使用以下答案简单地重新缩放轴:Change the axis scale of 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 :(得分:0)

我无法运行您的代码,但是我认为您正在寻找extent= argument to imshow()。有关更多信息,请参见the page on origin and extent

像这样的事情可能有用吗?

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