在R中的球体上绘制点

时间:2015-12-31 00:15:15

标签: r visualization

你能帮我在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)

2 个答案:

答案 0 :(得分:17)

开始
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

创建一个&#34;线框&#34;球体(我通过绘制两个球体在这里作弊一点,一个比另一个球体稍微大一点......可能有更好的方法来做到这一点,但我不能轻易/快速地计算它出)。

来自Wolfram web page on sphere point picking(图片来源)

  

同样地,我们可以选择u = cos(phi)来均匀分布(因此我们有du = sin phi dphi)并得到点library("rgl") spheres3d(0,0,0,lit=FALSE,color="white") spheres3d(0,0,0,radius=1.01,lit=FALSE,color="black",front="lines") ; x = sqrt(1-u^2)*cos(theta); y = sqrt(1-u^2)*sin(theta),其中theta位于[0,2pi],u位于[-1,1],它们也均匀分布在S ^ 2上。

所以:

z=u

球体需要花费更多精力来渲染,但比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) (平面正方形)的结果更漂亮......

enter image description here

答案 1 :(得分:1)

我想逛逛最近的软件包sphereplot,如果您真的很勇敢,可以建议使用gensphere,以便在3空间中高度配置点。

sphereplot包括一些简单的功能,例如(从手册页中引用)

  

pointsphere 随机球指向
   说明随机生成数据
  球体内均匀分布的点。
  用法
  点球(N = 100,longlim = c(0,360),latlim = c(-90,90),rlim =   c(0,1))
  参数   N个随机点数。
  longlim经度的极限,以度为单位。
  latlim纬度极限(度)。
  rlim半径限制。