2015-09-06 198 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