如何在Python Matplotlib的2D-FFT图上叠加极坐标网格?
在2D FFT图上叠加极坐标网格的简便方法
直接使用极坐标投影(projection='polar')会扭曲FFT图像的笛卡尔布局,导致结果不符合预期。正确的做法是在笛卡尔坐标系的FFT图上手动绘制极坐标网格线,步骤如下:
完整示例代码
import numpy as np import matplotlib.pyplot as plt # 生成示例数据并计算FFT a = np.mgrid[:10, :10][0] fft_data = np.abs(np.fft.fft2(a)) shifted_fft = np.fft.fftshift(fft_data) # 将直流分量移至图像中心 # 生成频率坐标轴 freq_x = np.fft.fftshift(np.fft.fftfreq(10)) freq_y = np.fft.fftshift(np.fft.fftfreq(10)) # 创建画布和笛卡尔坐标轴 fig, ax = plt.subplots() # 绘制移位后的FFT图像 im = ax.imshow(shifted_fft, extent=[freq_x[0], freq_x[-1], freq_y[0], freq_y[-1]], cmap='viridis') # 计算极坐标网格的最大半径(图像对角线长度的一半) max_freq = np.max(np.abs(freq_x)) r_max = np.sqrt(2) * max_freq # 定义极坐标网格参数 num_circles = 5 # 同心圆数量 num_radial_lines = 8 # 径向线数量 # 绘制同心圆 radii = np.linspace(0, r_max, num_circles)[1:] # 跳过中心的0半径 theta_circle = np.linspace(0, 2*np.pi, 100) # 生成圆周上的点 for radius in radii: x_circle = radius * np.sin(theta_circle) y_circle = radius * np.cos(theta_circle) ax.plot(x_circle, y_circle, color='white', linestyle='--', linewidth=0.5) # 绘制径向线(顺时针方向,从顶部开始) angles = np.linspace(0, 2*np.pi, num_radial_lines, endpoint=False) for angle in angles: x_line = [0, r_max * np.sin(angle)] y_line = [0, r_max * np.cos(angle)] ax.plot(x_line, y_line, color='white', linestyle='--', linewidth=0.5) # 调整坐标轴样式 ax.axis('equal') # 保证网格为正圆形而非椭圆形 ax.set_xlabel('X频率') ax.set_ylabel('Y频率') ax.set_title('叠加极坐标网格的2D FFT图') plt.colorbar(im) plt.show()
关键说明
- FFT移位:使用
np.fft.fftshift将直流分量移至图像中心,使极坐标网格对称分布,符合FFT分析的常规可视化习惯。 - 手动绘制极坐标网格:
- 同心圆:通过极坐标转笛卡尔坐标公式生成圆周点,再绘制线条。
- 径向线:从中心出发,沿指定角度绘制到图像边缘的直线。
- 等比例坐标轴:
ax.axis('equal')确保网格呈现正圆形,避免因坐标轴比例不一致导致的椭圆变形。 - 网格样式:可通过调整
color、linestyle、linewidth参数修改网格的外观,使其与FFT图像对比度合适。
内容的提问来源于stack exchange,提问作者kolrocket
相关产品推荐
相关产品推荐

