2015-12-31 65 views
11

你能幫我在R畫一個類似於這個圖嗎?在R球上畫一個球形點

enter image description here

我想有它的互動,這樣我可以旋轉球體。我想我應該使用rgl。我發現一個類似於我需要的示例here,但是我找不到繪製網格而不是填充球體的方法。

UPD:一個可重複的數據集,可以幫助回答這個問題(我把它從here):

u <- runif(1000,0,1) 
v <- runif(1000,0,1) 
theta <- 2 * pi * u 
phi <- acos(2 * v - 1) 
x <- sin(theta) * cos(phi) 
y <- sin(theta) * sin(phi) 
z <- cos(theta) 
library("lattice") 
cloud(z ~ x + y) 

回答

17

開始

library("rgl") 
spheres3d(0,0,0,lit=FALSE,color="white") 
spheres3d(0,0,0,radius=1.01,lit=FALSE,color="black",front="lines") 

創造 「線框」 領域(我在這裏通過畫兩個球體來欺騙一個球體,其中一個比另一個球體大一點......可能有更好的方法來做到這一點,但我不能很容易/很快地弄清楚)。

Wolfram web page on sphere point picking(您的圖片的來源),我們得到

同樣,我們可以挑選U = COS(PHI)是均勻分佈(所以我們有杜=罪披DPHI),並獲得分x = sqrt(1-u^2)*cos(theta); y = sqrt(1-u^2)*sin(theta); z=u,其中θ在[0,2pi)和u在[-1,1]中,它們也均勻分佈在S^2上。

所以:

set.seed(101) 
n <- 50 
theta <- runif(n,0,2*pi) 
u <- runif(n,-1,1) 
x <- sqrt(1-u^2)*cos(theta) 
y <- sqrt(1-u^2)*sin(theta) 
z <- u 
spheres3d(x,y,z,col="red",radius=0.02) 

的領域需要一些更多的努力來呈現,但比的points3d()(平方塊)的結果更漂亮......

enter image description here

+0

一種筆記小牛+ Mac用戶。如果您從當前版本的源代碼進行編譯:rgl_0.95.1435,則可能會獲得比使用CRAN上的二進制版本更好的結果。 –

+0

是否可以避免在球體上顯示背部點?爲了使它不透明? – desa