You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用imshow调整坐标轴并正确显示双频率分量数据点?

调整FFT结果坐标轴以显示正确频率分量

我需要正确调整坐标轴,以便查看两个频率的x和y分量数值。目前有两段代码:

  • 第一段能显示正确数据,但坐标轴标注错误
  • 第二段坐标轴显示正确,但两个数据点未显示

第一段代码

from scipy.fft import fft2, fftshift
import numpy as np
import matplotlib.pyplot as plt
from skimage.filters import window
from scipy.fftpack import fftfreq


k = np.linspace(0,4.76*10,2400)
kx,ky = np.meshgrid(k, k)
x1 = 0.3
y1 = 0.4
x2 = 0.3
y2 = 1

z = 0.05*np.cos(2*np.pi*kx*x1 + 2*np.pi*ky*y1) + 0.05*np.cos(2*np.pi*kx*x2 + 2*np.pi*ky*y2)

wz = z * window('hann', z.shape)


zf = np.abs(fftshift(fft2(wz)))[1200:, 1200:]
plt.figure(1)
plt.axis([0,100, 0,100])

plt.imshow(zf)
plt.show()

运行结果

第一段代码运行结果


第二段代码

from scipy.fft import fft2, fftshift
import numpy as np
import matplotlib.pyplot as plt
from skimage.filters import window
from scipy.fftpack import fftfreq


k = np.linspace(0,4.76*10,2400)
kx,ky = np.meshgrid(k, k)
x1 = 0.3
y1 = 0.4
x2 = 0.3
y2 = 1

z = 0.05*np.cos(2*np.pi*kx*x1 + 2*np.pi*ky*y1) + 0.05*np.cos(2*np.pi*kx*x2 + 2*np.pi*ky*y2)

wz = z * window('hann', z.shape)


zf = np.abs(fftshift(fft2(wz)))[1200:, 1200:]
fig, ax = plt.subplots()
ax.set(xlim=(0, 2), ylim=(0, 2))

f = fftfreq(len(k), np.diff(k)[0])
ax.imshow(zf,extent=[0,f[:k.size//2][-1], 0 , f[:k.size//2][-1]])
plt.show()

运行结果

第二段代码运行结果


问题修复代码

两段代码的核心问题在于imshow的原点设置和坐标轴范围不匹配。修复后的代码如下:

from scipy.fft import fft2, fftshift
import numpy as np
import matplotlib.pyplot as plt
from skimage.filters import window
from scipy.fftpack import fftfreq

k = np.linspace(0, 4.76*10, 2400)
kx, ky = np.meshgrid(k, k)
x1 = 0.3
y1 = 0.4
x2 = 0.3
y2 = 1

# 生成含两个频率分量的信号
z = 0.05*np.cos(2*np.pi*kx*x1 + 2*np.pi*ky*y1) + 0.05*np.cos(2*np.pi*kx*x2 + 2*np.pi*ky*y2)
# 加汉宁窗减少频谱泄漏
wz = z * window('hann', z.shape)

# 计算FFT并移位,取正频率部分
zf = np.abs(fftshift(fft2(wz)))[1200:, 1200:]

# 计算频率轴步长与正频率范围
dk = np.diff(k)[0]
f = fftfreq(len(k), dk)
f_pos = f[:len(k)//2]
f_max = f_pos[-1]

fig, ax = plt.subplots()
# 设置origin='lower'让y轴从下到上递增,aspect='auto'适配比例
ax.imshow(zf, extent=[0, f_max, 0, f_max], origin='lower', aspect='auto')
ax.set_xlabel('X频率分量')
ax.set_ylabel('Y频率分量')
ax.grid(True, alpha=0.3)
plt.show()

修复说明

  1. origin='lower':将图像原点设置在左下角,与常规坐标系一致,确保频率值的y轴方向和实际分量匹配。
  2. aspect='auto':自动调整图像比例,避免因数据维度导致坐标轴拉伸,准确显示频率点位置。
  3. 移除手动坐标轴限制:让extent参数自动控制坐标轴范围,确保两个频率点((0.3,0.4)和(0.3,1))处于可视区域内。

内容的提问来源于stack exchange,提问作者mikanim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:15:40