【问题标题】:I have a problem with plotting sphere and a curve on it我在绘制球体和曲线时遇到问题
【发布时间】:2020-09-24 17:53:12
【问题描述】:

我正在尝试在球体上绘制曲线,但我无法同时绘制它们。我用 欧几里得范数 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))]

其中 xvaluesyvalueszvalues 是我们的点欧几里得分量。

球体点数:

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 是球面点的欧几里得分量。

我的问题:

当我尝试绘制曲线而不绘制球体时,它可以工作。但是当我将它们绘制在一起时,它只会返回球体。

整个代码如下:

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()

我想要发生的事情:

我想在球体上绘制曲线,但它不会发生在我的代码中。我很感激任何提示。

【问题讨论】:

    标签: python numpy matplotlib plot curve


    【解决方案1】:

    如果您使用"." 选项来绘制点,例如

    circ = ax.plot(xvalues, yvalues,zvalues, '.', color='green', linewidth=1)
    

    在某些视角下,您会看到球体顶部的点,但有时即使它们在球体前面也会消失。这是matplotlib documentation 中解释的已知错误:

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

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

    【讨论】:

      【解决方案2】:

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

      ## 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()
      
      

      【讨论】:

      • 注意:我需要添加from mpl_toolkits.mplot3d import Axes3D 才能使上述代码正常工作
      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2021-05-07
      • 2021-12-17
      相关资源
      最近更新 更多