如何在Matplotlib中将一维极坐标数据转为等高线图?
解决Matplotlib极坐标等高线图的1D数据报错问题
首先修正你原始代码的缩进错误——g4.append(v)需要放在循环内部,否则只会保留最后一个计算值:
import numpy as np import math import matplotlib.pyplot as plt theta = np.arange(math.radians(0), math.radians(361), 0.01).tolist() g4 = [] for i in theta: v = ((2**(1-1)) * (1 + (1*math.cos(i)))**1) g4.append(v) # 修正缩进,确保每个θ对应的v都被添加到列表 # 原来的散点图代码 fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}) ax.scatter(theta, g4, c=g4, cmap='viridis')
错误原因
ax.contourf()要求输入的z参数必须是二维数组,因为它用来展示极坐标平面(θ, r)上的连续标量场,而你当前的g4是一维数组,仅记录了每个θ对应的r值,不符合函数的输入要求。
解决方案
根据你的需求分两种情况处理:
情况1:绘制极坐标下的二维标量场等高线
如果需要展示完整的二维场等高线,需要先构建θ和r的二维网格,再计算每个网格点对应的z值:
import numpy as np import matplotlib.pyplot as plt # 生成θ和r的网格数据 theta = np.linspace(0, 2*np.pi, 100) r = np.linspace(0, 2, 100) # 你的r(θ)=1+cosθ的最大值为2,所以r范围设0-2 theta_grid, r_grid = np.meshgrid(theta, r) # 计算每个网格点的z值,这里示例用r与目标曲线的差值作为场值 z = r_grid - (1 + np.cos(theta_grid)) # 创建极坐标子图并绘制等高线 fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}) contour = ax.contourf(theta_grid, r_grid, z, cmap='viridis', levels=20) fig.colorbar(contour) # 叠加原始的r(θ)曲线作为参考 ax.plot(theta, 1 + np.cos(theta), color='red', linewidth=2) plt.show()
情况2:填充极坐标曲线围成的区域
如果你的需求只是填充r(θ)曲线围成的区域(而非二维场等高线),不需要用contourf,直接用fill即可:
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}) ax.fill(theta, g4, color='skyblue', alpha=0.7) ax.plot(theta, g4, color='darkblue', linewidth=1) plt.show()
内容的提问来源于stack exchange,提问作者Dragmoogle
相关产品推荐
相关产品推荐

