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

如何在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()

关键说明

  1. FFT移位:使用np.fft.fftshift将直流分量移至图像中心,使极坐标网格对称分布,符合FFT分析的常规可视化习惯。
  2. 手动绘制极坐标网格:
    • 同心圆:通过极坐标转笛卡尔坐标公式生成圆周点,再绘制线条。
    • 径向线:从中心出发,沿指定角度绘制到图像边缘的直线。
  3. 等比例坐标轴:ax.axis('equal')确保网格呈现正圆形,避免因坐标轴比例不一致导致的椭圆变形。
  4. 网格样式:可通过调整color、linestyle、linewidth参数修改网格的外观,使其与FFT图像对比度合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:14:52