极坐标绘制双纽线时中心(r=0)线条未连接的解决方法
极坐标绘制双纽线时中心线条未连接的解决方法
问题描述
使用以下numpy和matplotlib代码绘制极坐标双纽线时,整体显示效果正常,但放大中心区域后发现r=0位置的线条未连接:
import numpy as np import matplotlib.pyplot as plt a = 2 rads = np.arange(0, 360, 0.001) r_vals = [] for rad in rads: r = a*(np.sqrt(np.sin(2*rad))) r_vals.append(r) fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}) ax.plot(rads, r_vals) ax.set_rlabel_position(22) ax.grid(True) ax.set_title("A line plot on a polar axis", va='bottom') plt.show()
问题原因
- 角度与弧度混淆:
np.sin默认处理弧度值,但原代码中rads是0-360的角度值,导致sin(2*rad)计算完全错误,大量区间内正弦值为负,根号运算返回nan,造成线条断裂。 - 双纽线的极坐标方程
r² = a² sin2θ中,θ的有效范围是[0, π/2]和[π, 3π/2],原代码未区分分支,也没处理正负r值,导致r=0处无连续点连接。
修复代码
import numpy as np import matplotlib.pyplot as plt a = 2 # 生成两个分支的有效弧度区间,包含r=0的端点 theta_lobe1 = np.linspace(0, np.pi/2, 1000) theta_lobe2 = np.linspace(np.pi, 3*np.pi/2, 1000) # 计算两个分支的r值,第二个分支取负r实现对称绘制 r_lobe1 = a * np.sqrt(np.sin(2 * theta_lobe1)) r_lobe2 = -a * np.sqrt(np.sin(2 * theta_lobe2)) # 合并两个分支的坐标,让线条在r=0处自然连接 theta_total = np.concatenate([theta_lobe1, theta_lobe2]) r_total = np.concatenate([r_lobe1, r_lobe2]) fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}) ax.plot(theta_total, r_total) ax.set_rlabel_position(22) ax.grid(True) ax.set_title("Lemniscate in Polar Axis", va='bottom') plt.show()
效果说明
修复后的代码通过拆分双纽线的两个对称分支,使用正负r值分别绘制,合并后线条会在r=0的位置自然连接,放大中心区域也能看到完整连续的线条。
内容的提问来源于stack exchange,提问作者abi
相关产品推荐
相关产品推荐

