如何用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()
修复说明
origin='lower':将图像原点设置在左下角,与常规坐标系一致,确保频率值的y轴方向和实际分量匹配。aspect='auto':自动调整图像比例,避免因数据维度导致坐标轴拉伸,准确显示频率点位置。- 移除手动坐标轴限制:让
extent参数自动控制坐标轴范围,确保两个频率点((0.3,0.4)和(0.3,1))处于可视区域内。
内容的提问来源于stack exchange,提问作者mikanim
相关产品推荐
相关产品推荐

