有没有办法针对特定数组而不是索引绘制 Matplotlib 的 Imshow?
Is there a way to plot Matplotlib's Imshow against a specific array rather than the indices?
我正在尝试使用 Imshow 绘制数据的二维傅立叶变换。但是,Imshow 根据其在数组中的索引绘制数据。我想根据包含相应频率值的一组数组绘制数据(每个暗淡一个数组),但无法弄清楚如何。
我有一个二维数据数组(高斯脉冲信号),我用 np.fft.fft2 进行了傅立叶变换。这一切都很好。然后,我使用 np.fft.fftfreq(len(data))*sampling_rate 获得每个维度的相应频率区间。我无法弄清楚如何使用 imshow 来绘制针对这些频率的数据。一维等效于我尝试使用 plt.plot(x,y) 而不是仅使用 plt.plot(y).
我的第一次尝试是使用 imshows "extent" 标志,但据我所知,它只是改变了轴限制,而不是实际的箱子。
我的下一个解决方案是使用 np.fft.fftshift 按数字顺序排列数据,然后使用此答案简单地重新缩放轴:。然而,频率仓的索引不是一个纯粹的比例因子,通常也有一个常数偏移量。
我尝试使用 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) 处看到一个峰值对应于我的信号频率(在它周围有一些下降对应于带宽),但是我的最大值出现在对应于频率索引的某个随机位置我的数据数组。如果有人有任何想法、修复或其他功能可以使用,我将不胜感激!
我无法 运行 你的代码,但我认为你正在寻找 extent=
argument to imshow()
. See the the page on origin
and extent
以获取更多信息。
这样的东西可能有用吗?
plt.imshow(Fdata, extent=(freqx[0],freqx[-1],freqy[0],freqy[-1]))
我正在尝试使用 Imshow 绘制数据的二维傅立叶变换。但是,Imshow 根据其在数组中的索引绘制数据。我想根据包含相应频率值的一组数组绘制数据(每个暗淡一个数组),但无法弄清楚如何。
我有一个二维数据数组(高斯脉冲信号),我用 np.fft.fft2 进行了傅立叶变换。这一切都很好。然后,我使用 np.fft.fftfreq(len(data))*sampling_rate 获得每个维度的相应频率区间。我无法弄清楚如何使用 imshow 来绘制针对这些频率的数据。一维等效于我尝试使用 plt.plot(x,y) 而不是仅使用 plt.plot(y).
我的第一次尝试是使用 imshows "extent" 标志,但据我所知,它只是改变了轴限制,而不是实际的箱子。
我的下一个解决方案是使用 np.fft.fftshift 按数字顺序排列数据,然后使用此答案简单地重新缩放轴:
我尝试使用 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) 处看到一个峰值对应于我的信号频率(在它周围有一些下降对应于带宽),但是我的最大值出现在对应于频率索引的某个随机位置我的数据数组。如果有人有任何想法、修复或其他功能可以使用,我将不胜感激!
我无法 运行 你的代码,但我认为你正在寻找 extent=
argument to imshow()
. See the the page on origin
and extent
以获取更多信息。
这样的东西可能有用吗?
plt.imshow(Fdata, extent=(freqx[0],freqx[-1],freqy[0],freqy[-1]))