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

极坐标绘制双纽线时中心(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()

问题原因

  1. 角度与弧度混淆:np.sin默认处理弧度值,但原代码中rads是0-360的角度值,导致sin(2*rad)计算完全错误,大量区间内正弦值为负,根号运算返回nan,造成线条断裂。
  2. 双纽线的极坐标方程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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:40:43