【问题标题】:Is there a way to plot Matplotlib's Imshow against a specific array rather than the indices?有没有办法根据特定数组而不是索引绘制 Matplotlib 的 Imshow?
【发布时间】:2019-11-14 12:07:37
【问题描述】:

我正在尝试使用 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) 处看到一个峰值,对应于我的信号频率(在它周围有一些下降对应于带宽),但我的最大值出现在与我的数据中的频率索引相对应的某个随机位置大批。如果有人有任何想法、修复或其他功能可以使用,我将不胜感激!

【问题讨论】:

  • 欢迎来到 SO!您的示例代码在第 8 行有语法错误() 缺失)。即使修复它,运行您的代码时我仍然会得到ValueError: sequence too large; cannot be greater than 32。不完全确定您要做什么。将有助于提供您获得的情节以及所需的结果(必要时使用油漆)。

标签: python numpy matplotlib 2d fft


【解决方案1】:

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

这样的方法可能有用吗?

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

【讨论】:

  • 我不确定您遇到了什么错误(我只是自己运行了代码),但无论如何,它看起来是有效的。非常感谢您的链接!它比标准文档更明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多