gpt4 book ai didi

python - Matplotlib 3D plot - 从某些角度看参数曲线 "wraparound"

转载 作者:太空宇宙 更新时间:2023-11-03 12:04:24 25 4
gpt4 key购买 nike

我一直在编写一个 Python 脚本 ( GitHub LINK ) 来可视化小行星/ cometd / meteor 体的轨道。该脚本还绘制了行星的位置及其轨道。

它恰好适用于半长轴较小的轨道(即“较小”轨道)。但是,当我的轨道远远超出海王星(例如哈雷型 cometd )时,从某些角度来看,会出现一种奇怪的“环绕”(找不到更好的词)效果。

让我告诉你我的意思:

图片编译: http://i.imgur.com/onSZG8s.png enter image description here

  1. 这张图片从一个没有中断的角度显示了情节。

  2. 当您将同一个绘图向右旋转一点时,就好像轨道对折并反转了方向!

  3. 如果您从很远的地方看图,您会发现椭圆是按应有的方式绘制的。

这里是可以重现问题的最小版本的代码。只有当相机的视角与大轨道紧密平行时,才会出现“环绕”。

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

def orbitalElements2Cartesian(a, e, I, peri, node, E):
""" Convert orbital elements to Cartesian coordinates in the Solar System.

Args:
a (float): semi-major axis (AU)
e (float): eccentricity
I (float): inclination (degrees)
peri (float): longitude of perihelion (degrees)
node (float): longitude of ascending node (degrees)
E (float): eccentric anomaly (radians)

"""

# The source of equations used:
# http://farside.ph.utexas.edu/teaching/celestial/Celestialhtml/node34.html

# Check if the orbit is parabolic or hyperbolic
if e >=1:
e = 0.99999999

# Convert degrees to radians
I, peri, node = map(np.radians, [I, peri, node])

# True anomaly
theta = 2*np.arctan(np.sqrt((1.0 + e)/(1.0 - e))*np.tan(E/2.0))

# Distance from the Sun to the poin on orbit
r = a*(1.0 - e*np.cos(E))

# Cartesian coordinates
x = r*(np.cos(node)*np.cos(peri + theta) - np.sin(node)*np.sin(peri + theta)*np.cos(I))
y = r*(np.sin(node)*np.cos(peri + theta) + np.cos(node)*np.sin(peri + theta)*np.cos(I))
z = r*np.sin(peri + theta)*np.sin(I)

return x, y, z


if __name__ == '__main__':

# Example orbital elements
# a, e, incl, peri, node
orb_elements = np.array([
[2.363, 0.515, 4.0, 205.0, 346.1],
[0.989, 0.089, 3.1, 55.6, 21.2],
[0.898, 0.460, 1.3, 77.1, 331.2],
[104.585332285, 0.994914, 89.3950, 130.8767, 282.4633]
])

# Setup the plot
fig = plt.figure()
ax = fig.gca(projection='3d')


# Eccentric anomaly (full range)
E = np.linspace(-np.pi, np.pi, 100)

# Plot the given orbits
for i, orbit in enumerate(orb_elements):
a, e, I, peri, node = orbit

# Take extra steps in E if the orbit is very large
if a > 50:
E = np.linspace(-np.pi, np.pi, (a/20.0)*100)

# Get the orbit in the cartesian space
x, y, z = orbitalElements2Cartesian(a, e, I, peri, node, E)

# Plot orbits
ax.plot(x, y, z, c='#32CD32')

# Add limits (in AU)
ax.set_xlim3d(-5,5)
ax.set_ylim3d(-5,5)
ax.set_zlim3d(-5,5)

plt.tight_layout()
plt.show()

我对此有点傻眼,似乎无法找到合适的解决方案。非常感谢您的帮助!

最佳答案

matplotlib 根据我的经验,它不适合复杂的 3D 绘图(我在轴值外有类似的奇怪行为)。像 mayavi 这样的东西可能值得考虑,因为它是为 3D 绘图设计的......

blog 中给出了可能的解决方法,基本上只是将轴值设置为 np.NaN 为您所需的轴。如果我将以下内容添加到您的示例中,

for r in [x,y,z]:
for i in np.arange(len(r)):
if r[i] < -5:
x[i] = np.NaN
y[i] = np.NaN
z[i] = np.NaN
elif r[i] > 5:
x[i] = np.NaN
y[i] = np.NaN
z[i] = np.NaN
else:
pass

它删除了环绕。

关于python - Matplotlib 3D plot - 从某些角度看参数曲线 "wraparound",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36608197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com