求助:基于1D数组实现极坐标彩色网格图的插值绘制
极坐标数据插值生成彩色网格图问题
现有数据
拥有三个1D数组:
theta数组
theta = np.array([180., 180., 180., 180., 180., 180., 180., 180., 180., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 225., 225., 225., 225., 225., 225., 225., 225., 225., 45., 45., 45., 45., 45., 45., 45., 45., 45., 45., 270., 270., 270., 270., 270., 270., 270., 270., 270., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 315., 315., 315., 315., 315., 315., 315., 315., 315., 135., 135., 135., 135., 135., 135., 135., 135., 135., 135.])
phi数组
phi = np.array([45. , 39.98823529, 35.01176471, 30. , 24.98823529, 20.01176471, 15. , 9.98823529, 5.01176471, 0. , 5.01176471, 9.98823529, 15. , 20.01176471, 24.98823529, 30. , 35.01176471, 39.98823529, 45. , 45. , 39.98823529, 35.01176471, 30. , 24.98823529, 20.01176471, 15. , 9.98823529, 5.01176471, 0. , 5.01176471, 9.98823529, 15. , 20.01176471, 24.98823529, 30. , 35.01176471, 39.98823529, 45. , 45. , 39.98823529, 35.01176471, 30. , 24.98823529, 20.01176471, 15. , 9.98823529, 5.01176471, 0. , 5.01176471, 9.98823529, 15. , 20.01176471, 24.98823529, 30. , 35.01176471, 39.98823529, 45. , 45. , 39.98823529, 35.01176471, 30. , 24.98823529, 20.01176471, 15. , 9.98823529, 5.01176471, 0. , 5.01176471, 9.98823529, 15. , 20.01176471, 24.98823529, 30. , 35.01176471, 39.98823529, 45. ])
violet_ints数组
violet_ints = np.array([ 60821.47285091, 71469.47778826, 81950.58139812, 92660.95741024, 103228.07719577, 113446.6171393 , 123862.48451513, 132666.65201113, 138673.94497866, 141418.87424494, 140947.68057807, 137704.80141046, 131712.10023037, 122871.74227686, 111022.93897237, 98051.87876927, 85884.71515151, 74789.81179595, 64223.21535332, 47239.6029958 , 59060.46569283, 71631.51992138, 85056.88727878, 97838.32318773, 110985.04206186, 123046.60805235, 131994.74029036, 138009.81758468, 141092.29699058, 141436.99265739, 139367.40863866, 134564.53259257, 127256.22737589, 117476.56579378, 105893.78184852, 94434.79559289, 83012.77977437, 71513.83906988, 35465.27768276, 52489.59008641, 70259.4064192 , 87011.24343702, 101845.51856053, 114496.37908394, 125113.38041456, 132956.15831876, 138245.26502938, 140988.36471711, 141467.04309028, 139302.73813352, 135346.73647267, 128688.98045284, 120273.38645452, 110273.45442647, 99177.33744858, 87341.78739578, 74874.97094334, 50986.33091372, 63371.63698099, 76937.62936534, 91341.43206481, 105418.35862792, 117371.0063522 , 127397.07283259, 134693.40421132, 139258.98685025, 141392.73492377, 140797.81487188, 137360.21016255, 130967.39590833, 122385.40640793, 113290.91743172, 103305.45203984, 93133.15852394, 82350.70121816, 71046.51493323])
现有绘图代码
已通过以下代码生成极坐标散点图:
import matplotlib.pyplot as plt import numpy as np plt.figure(figsize=(10, 20)) ax = plt.axes(projection='polar') axx = ax.scatter(theta*np.pi/180, phi, c=violet_ints, cmap='viridis') plt.colorbar(axx, shrink = 0.4);
问题描述
需要对上述数据进行插值,生成极坐标彩色网格图。尝试用np.meshgrid转换数组:
Theta, Phi = np.meshgrid(theta, phi) _, Violet_Ints = np.meshgrid(violet_ints, violet_ints)
但用pcolormesh绘图结果不符合预期,求解决方法。
解决方案
问题原因
直接对原始重复分组的1D数组做meshgrid,会生成冗余且不规则的网格点,无法满足插值和网格绘图的要求。
正确实现步骤
- 提取原始数据中唯一的角度值,构建规则的极坐标网格
- 使用插值算法将离散的强度值映射到规则网格上
- 绘制极坐标彩色网格图
完整代码
import matplotlib.pyplot as plt import numpy as np from scipy.interpolate import griddata # 1. 将theta转换为弧度 theta_rad = theta * np.pi / 180 # 2. 提取唯一的角度值并排序,构建规则网格 unique_theta = np.sort(np.unique(theta_rad)) unique_phi = np.sort(np.unique(phi)) Theta_grid, Phi_grid = np.meshgrid(unique_theta, unique_phi) # 3. 对强度值进行插值,得到规则网格上的数值 violet_grid = griddata( (theta_rad, phi), violet_ints, (Theta_grid, Phi_grid), method='cubic' # 三次插值,平滑效果好;追求速度可换为'linear' ) # 4. 绘制极坐标网格图 plt.figure(figsize=(10,10)) ax = plt.axes(projection='polar') pcm = ax.pcolormesh(Theta_grid, Phi_grid, violet_grid, cmap='viridis') plt.colorbar(pcm, shrink=0.6) ax.set_title('极坐标插值彩色网格图', y=1.1) plt.show()
说明
- 若未安装
scipy,可执行pip install scipy完成安装 - 插值方法可选
linear(线性,速度快)或cubic(三次,平滑度高),可根据需求调整
内容的提问来源于stack exchange,提问作者Alexey Grishaev
相关产品推荐
相关产品推荐

