2015-09-06 113 views
4

我试图使用matplotlib得出这样一个领域:蟒蛇matplotlib:绘制3D球体圆周

enter image description here

,但我找不到有背面有一个虚线的方式和垂直圆周看起来有点怪

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

fig = plt.figure(figsize=(12,12), dpi=300) 
ax = fig.add_subplot(111, projection='3d') 
ax.set_aspect('equal') 

u = np.linspace(0, 2 * np.pi, 100) 
v = np.linspace(0, np.pi, 100) 

x = 1 * np.outer(np.cos(u), np.sin(v)) 
y = 1 * np.outer(np.sin(u), np.sin(v)) 
z = 1 * np.outer(np.ones(np.size(u)), np.cos(v)) 
#for i in range(2): 
# ax.plot_surface(x+random.randint(-5,5), y+random.randint(-5,5), z+random.randint(-5,5), rstride=4, cstride=4, color='b', linewidth=0, alpha=0.5) 

ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b', linewidth=0, alpha=0.5) 
ax.plot(np.sin(theta),np.cos(u),0,color='k') 
ax.plot([0]*100,np.sin(theta),np.cos(u),color='k') 

enter image description here

回答

3

在你展示的例子,我不认为词圆周可以相互垂直(即,一个是赤道,一个贯穿北极和南极)。如果水平圆圈是赤道,那么北极必须位于通过表示球体的黄色圆圈中心的垂直线上。否则,赤道右侧看起来会比左侧高或低。但是,代表极圆的椭圆只能穿过黄圈顶部和底部的中心线。因此,北极位于球体的顶部,这意味着我们必须直视赤道,这意味着它应该看起来像一条线而不是一条椭圆。

下面是一些代码来重现类似于您发布的数字的东西:

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.set_aspect('equal') 

u = np.linspace(0, 2 * np.pi, 100) 
v = np.linspace(0, np.pi, 100) 

x = 1 * np.outer(np.cos(u), np.sin(v)) 
y = 1 * np.outer(np.sin(u), np.sin(v)) 
z = 1 * np.outer(np.ones(np.size(u)), np.cos(v)) 
#for i in range(2): 
# ax.plot_surface(x+random.randint(-5,5), y+random.randint(-5,5), z+random.randint(-5,5), rstride=4, cstride=4, color='b', linewidth=0, alpha=0.5) 
elev = 10.0 
rot = 80.0/180 * np.pi 
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b', linewidth=0, alpha=0.5) 
#calculate vectors for "vertical" circle 
a = np.array([-np.sin(elev/180 * np.pi), 0, np.cos(elev/180 * np.pi)]) 
b = np.array([0, 1, 0]) 
b = b * np.cos(rot) + np.cross(a, b) * np.sin(rot) + a * np.dot(a, b) * (1 - np.cos(rot)) 
ax.plot(np.sin(u),np.cos(u),0,color='k', linestyle = 'dashed') 
horiz_front = np.linspace(0, np.pi, 100) 
ax.plot(np.sin(horiz_front),np.cos(horiz_front),0,color='k') 
vert_front = np.linspace(np.pi/2, 3 * np.pi/2, 100) 
ax.plot(a[0] * np.sin(u) + b[0] * np.cos(u), b[1] * np.cos(u), a[2] * np.sin(u) + b[2] * np.cos(u),color='k', linestyle = 'dashed') 
ax.plot(a[0] * np.sin(vert_front) + b[0] * np.cos(vert_front), b[1] * np.cos(vert_front), a[2] * np.sin(vert_front) + b[2] * np.cos(vert_front),color='k') 

ax.view_init(elev = elev, azim = 0) 


plt.show() 

3d sphere