Python 我在绘制球体和球体上的曲线时遇到问题

Python 我在绘制球体和球体上的曲线时遇到问题,python,numpy,matplotlib,plot,curve,Python,Numpy,Matplotlib,Plot,Curve,我试图在球体上绘制曲线,但无法同时绘制它们。我用欧几里德范数为我的曲线确定了一些点10,并用其他一些点分别绘制半径为10的球体,如下所示 曲线的点: random_numbers=[] basevalues=np.linspace(-0.9,0.9,100) for i in range(len(basevalues)): t=random.random() random_numbers.append(t*10) xvalues=[random_numbers[i]*n

我试图在球体上绘制曲线,但无法同时绘制它们。我用欧几里德范数为我的曲线确定了一些点10,并用其他一些点分别绘制半径为10的球体,如下所示

曲线的点:

random_numbers=[]
basevalues=np.linspace(-0.9,0.9,100)
for i in range(len(basevalues)):
    t=random.random()
    random_numbers.append(t*10)
    
xvalues=[random_numbers[i]*np.cos(basevalues[i]) for i in range(len(basevalues))]
yvalues=[random_numbers[i]*np.sin(basevalues[i]) for i in range(len(basevalues))]
zvalues=[np.sqrt(100-xvalues[i]**2-yvalues[i]**2)for i in range(len(basevalues))]
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
其中,xvaluesyvalueszvalues是我们的点欧几里德分量

球体的点:

random_numbers=[]
basevalues=np.linspace(-0.9,0.9,100)
for i in range(len(basevalues)):
    t=random.random()
    random_numbers.append(t*10)
    
xvalues=[random_numbers[i]*np.cos(basevalues[i]) for i in range(len(basevalues))]
yvalues=[random_numbers[i]*np.sin(basevalues[i]) for i in range(len(basevalues))]
zvalues=[np.sqrt(100-xvalues[i]**2-yvalues[i]**2)for i in range(len(basevalues))]
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
其中,x,yz是球面点的欧氏分量

我的问题:

random_numbers=[]
basevalues=np.linspace(-0.9,0.9,100)
for i in range(len(basevalues)):
    t=random.random()
    random_numbers.append(t*10)
    
xvalues=[random_numbers[i]*np.cos(basevalues[i]) for i in range(len(basevalues))]
yvalues=[random_numbers[i]*np.sin(basevalues[i]) for i in range(len(basevalues))]
zvalues=[np.sqrt(100-xvalues[i]**2-yvalues[i]**2)for i in range(len(basevalues))]
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
当我尝试绘制曲线而不绘制球体时,它会起作用。但当我把它们画在一起时,它只会返回球体

整个代码如下所示:

import matplotlib.pyplot as plt
import numpy as np
import random


#Curve points

random_numbers=[]
basevalues=np.linspace(-0.9,0.9,100)
for i in range(len(basevalues)):
    t=random.random()
    random_numbers.append(t*10)
    
xvalues=[random_numbers[i]*np.cos(basevalues[i]) for i in range(len(basevalues))]
yvalues=[random_numbers[i]*np.sin(basevalues[i]) for i in range(len(basevalues))]
zvalues=[np.sqrt(100-xvalues[i]**2-yvalues[i]**2)for i in range(len(basevalues))]


# Sphere points

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))

# Plot the surface and curve 

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
circ = ax.plot(xvalues,yvalues,zvalues, color='green',linewidth=1)
sphere=ax.plot_surface(x, y, z, color='r')


ax.set_zlim(-10, 10)
plt.xlabel("X axes")
plt.ylabel("Y axes")
plt.show()
我希望发生的事情:

random_numbers=[]
basevalues=np.linspace(-0.9,0.9,100)
for i in range(len(basevalues)):
    t=random.random()
    random_numbers.append(t*10)
    
xvalues=[random_numbers[i]*np.cos(basevalues[i]) for i in range(len(basevalues))]
yvalues=[random_numbers[i]*np.sin(basevalues[i]) for i in range(len(basevalues))]
zvalues=[np.sqrt(100-xvalues[i]**2-yvalues[i]**2)for i in range(len(basevalues))]
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
我想在球体上绘制曲线,但在我的代码中没有。非常感谢您的提示。

如果您使用
选项绘制点,如

circ = ax.plot(xvalues, yvalues,zvalues, '.', color='green', linewidth=1)
在某些视角下,您将看到球体顶部的点,但有时即使它们位于球体前面也会消失。这是一个已知的错误,在中进行了解释:

我的3D绘图在某些视角下看起来不正确: 这可能是mplot3d最常见的问题。问题是,从某些视角来看,一个3D对象会出现在另一个对象的前面,即使它实际上在后面。这可能导致绘图看起来“物理上不正确”


在同一文档中,开发人员建议在Python中更高级地使用3D绘图。

使用球坐标,您可以轻松做到:

## plot a circle on the sphere using spherical coordinate.
import numpy as np
import matplotlib.pyplot as plt

# a complete sphere
R = 10
theta = np.linspace(0, 2 * np.pi, 1000)
phi = np.linspace(0, np.pi, 1000)
x_sphere = R * np.outer(np.cos(theta), np.sin(phi))
y_sphere = R * np.outer(np.sin(theta), np.sin(phi))
z_sphere = R * np.outer(np.ones(np.size(theta)), np.cos(phi))

# a complete circle on the sphere
x_circle = R * np.sin(theta)
y_circle = R * np.cos(theta)

# 3d plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x_sphere, y_sphere, z_sphere, color='blue', alpha=0.2)
ax.plot(x_circle, y_circle, 0, color='green')
plt.show()


注意:我需要从mpl_toolkits.mplot3d import Axes3D添加
,以使上述代码正常工作