极坐标等高线图异常问题:轮廓呈现锯齿状
极坐标等高线绘制异常问题解决
问题说明
用模拟数据时,极坐标散点和基于meshgrid生成的等高线都能正常显示;但使用真实的50个离散样本点时,散点绘制正常,用同样方法调用contourf生成的等高线却呈现锯齿状异常,无法得到预期的同心轮廓效果。
模拟数据代码(正常运行)
import numpy as np import math import matplotlib.pyplot as plt # 模拟数据准备 phi = np.linspace(0, math.pi*2, 40) # 完整圆周角度 phi = np.concatenate([phi, phi, phi, phi]) # 重复4次 rho = np.array([0,1,2,3]) # 四个固定半径 rho = np.repeat(rho, 40) assert phi.shape == rho.shape # 绘制散点 plt.figure() ax = plt.subplot(111, projection='polar') ax.scatter(phi, rho, c=rho) ax.set_ylim(0,4) plt.show()
真实数据样本代码(散点正常)
import numpy as np import matplotlib.pyplot as plt rho = np.array([0.38818333, 0.73367091, 0.42336148, 1.39013061, 0.31064486, 0.34546275, 0.05445943, 0.85551576, 0.55174167, 1.42371249, 0.17644804, 1.76221456, 0.64519126, 0.02408941, 1.43986863, 0.72718428, 0.4262945 , 0.1355583 , 0.86319986, 0.71212376, 0.14891707, 1.01624534, 1.26915981, 1.39384488, 0.09623481, 0.92635469, 1.74757901, 0.15811954, 0.22052651, 0.30784166, 0.92740352, 1.29621377, 0.29832842, 1.04442307, 1.36185399, 0.42979785, 0.94402815, 0.3786981 , 0.75865969, 1.97273479, 0.61140136, 0.71452862, 0.25793468, 1.1751275 , 1.53945948, 0.64150917, 0.09274101, 0.52548715, 0.7932458 , 0.90292444]) phi = np.array([1.04208195, 4.67055389, 3.32909655, 1.18709268, 0.86036178, 5.820191 , 4.30457004, 1.81242968, 0.64295926, 4.85684143, 2.73937709, 3.22891963, 0.25822595, 0.69526782, 0.70709764, 1.92901075, 3.44538869, 5.38541473, 0.95255568, 4.01519928, 0.8503274 , 5.26774545, 4.07787945, 4.51718652, 0.3170884 , 2.1946835 , 3.12550771, 5.67275731, 1.0000195 , 1.82570239, 5.62578391, 0.81923255, 2.00131474, 0.48190872, 4.78875363, 5.60395833, 2.01674743, 2.13494958, 5.10829845, 0.95324309, 1.59531506, 4.99145225, 6.19873491, 3.32802456, 1.15590926, 0.52989939, 6.02205398, 3.66013508, 4.16276819, 2.60498467]) assert phi.shape == rho.shape # 均为(50,) # 绘制散点 plt.figure() ax = plt.subplot(111, projection='polar') ax.scatter(phi, rho, c=rho) ax.set_ylim(0,3) plt.show()
异常的等高线绘制代码
# 直接用原始数据生成网格 X, Y = np.meshgrid(phi, rho) plt.figure(figsize=(10,10)) ax = plt.subplot(111, projection='polar') ax.scatter(X, Y, c=Y) CS = ax.contourf(X,Y, Y, 2, alpha=0.4) ax.set_ylim(0,4) plt.show()
问题原因
模拟数据的phi和rho是规则排列的:每个固定半径对应完整的角度序列,用meshgrid能生成整齐的极坐标网格。但真实数据是无序的离散点,直接用原始的phi和rho生成meshgrid会得到混乱的网格,contourf无法识别出同心轮廓,自然呈现锯齿状。
解决方案
需要先将离散的真实数据插值到规则的极坐标网格上,步骤如下:
- 生成均匀的角度和半径序列,构建规则网格
- 使用插值方法将原始数据映射到规则网格
- 基于规则网格绘制等高线
完整修复代码
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import griddata # 真实数据 rho = np.array([0.38818333, 0.73367091, 0.42336148, 1.39013061, 0.31064486, 0.34546275, 0.05445943, 0.85551576, 0.55174167, 1.42371249, 0.17644804, 1.76221456, 0.64519126, 0.02408941, 1.43986863, 0.72718428, 0.4262945 , 0.1355583 , 0.86319986, 0.71212376, 0.14891707, 1.01624534, 1.26915981, 1.39384488, 0.09623481, 0.92635469, 1.74757901, 0.15811954, 0.22052651, 0.30784166, 0.92740352, 1.29621377, 0.29832842, 1.04442307, 1.36185399, 0.42979785, 0.94402815, 0.3786981 , 0.75865969, 1.97273479, 0.61140136, 0.71452862, 0.25793468, 1.1751275 , 1.53945948, 0.64150917, 0.09274101, 0.52548715, 0.7932458 , 0.90292444]) phi = np.array([1.04208195, 4.67055389, 3.32909655, 1.18709268, 0.86036178, 5.820191 , 4.30457004, 1.81242968, 0.64295926, 4.85684143, 2.73937709, 3.22891963, 0.25822595, 0.69526782, 0.70709764, 1.92901075, 3.44538869, 5.38541473, 0.95255568, 4.01519928, 0.8503274 , 5.26774545, 4.07787945, 4.51718652, 0.3170884 , 2.1946835 , 3.12550771, 5.67275731, 1.0000195 , 1.82570239, 5.62578391, 0.81923255, 2.00131474, 0.48190872, 4.78875363, 5.60395833, 2.01674743, 2.13494958, 5.10829845, 0.95324309, 1.59531506, 4.99145225, 6.19873491, 3.32802456, 1.15590926, 0.52989939, 6.02205398, 3.66013508, 4.16276819, 2.60498467]) # 1. 生成规则的极坐标网格 phi_grid = np.linspace(0, 2*np.pi, 100) # 均匀角度序列 rho_grid = np.linspace(0, 3, 100) # 均匀半径序列 PHI, RHO = np.meshgrid(phi_grid, rho_grid) # 2. 转换为笛卡尔坐标(griddata要求输入笛卡尔坐标) x = rho * np.cos(phi) y = rho * np.sin(phi) x_grid = RHO * np.cos(PHI) y_grid = RHO * np.sin(PHI) # 3. 插值:将原始rho值映射到规则网格 z_grid = griddata((x, y), rho, (x_grid, y_grid), method='cubic') # 4. 绘制极坐标等高线 plt.figure(figsize=(10,10)) ax = plt.subplot(111, projection='polar') ax.scatter(phi, rho, c=rho, zorder=5) # 叠加原始散点 CS = ax.contourf(PHI, RHO, z_grid, 10, alpha=0.4) ax.set_ylim(0,3) plt.colorbar(CS) plt.show()
说明
- 使用
griddata的cubic插值方法能生成平滑的轮廓,也可根据需求选择linear或nearest方法 - 规则网格的分辨率(示例中为100)可调整:数值越大轮廓越平滑,但计算量也会增加
内容的提问来源于stack exchange,提问作者Mitchell van Zuylen
相关产品推荐
相关产品推荐

