将一个平面添加到scatterplot3d

时间:2015-02-20 16:34:24

标签: r scatter-plot scatter plane scatter3d

x <-rnorm(500,50,2)
y <-rnorm(500,5,1)
z <-rnorm(500,6,1)

s3d <- scatterplot3d(x[z<6], y[z<6], z[z<6], zlim=range(z),  color="darkgrey", col.axis="blue",col.grid="lightblue",   main="scatterplot3d - 1", pch=20)
s3d$plane3d(6,0,0)
s3d$points3d(x[z>=6], y[z>=6], z[z>=6], pch=20)

以上代码告诉我如何添加一架飞机&#39; z = 6&#39;到三维散点图。

第一个问题是: 我想知道如何添加一个平面,例如&#39; x = 3&#39;或者&#39; y = 2&#39;。

R帮助文件解释了

plane3d(Intercept, x.coef = NULL, y.coef = NULL, lty = "dashed", lty.box = NULL, ...). Instead of Intercept a vector containing 3 elements can be specified.

第二个问题是: 我也想知道带有3个元素&#39;的向量是什么?而不是拦截,x.coef和y.coef参数的作用是什么。

1 个答案:

答案 0 :(得分:1)

问题1:我会使用线性模型来添加平面,正如我所描述的here以及作者在vignette中使用的那样:

plot3d <- scatterplot3d(x, y, z, ... )
model  <- lm(y ~ x + z)
plot3d$plane3d(model)

您可以手动指定xyz截距,但我不推荐它,因为它会产生一些奇怪的行为。您还可以使用针对点的函数构造复杂的网格曲面,但正如作者在插图中所述:

  

请注意,scatterplot3d用于生成散点图,而不是   绘制表面,对于此目的并不是真正的用户友好,   我们通常宁愿使用R的persp函数。

问题2:具有三个元素的向量是xyz截距的容器。您可以像上面s3d$plane3d(6,0,0)一样手动指定它们。 x和y系数似乎用于将这两个变量映射到平面上。

要手动制作特定的飞机,以下是Uwe本人的建议:

spd <- scatterplot3d(1:10, 1:10, 1:10)

# xy
spd$plane3d(0.3549896,0,0,lty="dotted")

# yz
x0 <- 5
xyz1 <- spd$xyz.convert(rep(x0, 6), rep(0, 6), seq(0, 10, by=2))
xyz2 <- spd$xyz.convert(rep(x0, 6), rep(10, 6), seq(0, 10, by=2))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

xyz1 <- spd$xyz.convert(rep(x0, 6), seq(0, 10, by=2), rep(0, 6))
xyz2 <- spd$xyz.convert(rep(x0, 6), seq(0, 10, by=2), rep(10, 6))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

# zx
y0 <- 6
xyz1 <- spd$xyz.convert(rep(0, 6), rep(y0, 6), seq(0, 10, by=2))
xyz2 <- spd$xyz.convert(rep(10, 6), rep(y0, 6), seq(0, 10, by=2))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

xyz1 <- spd$xyz.convert(seq(0, 10, by=2), rep(y0, 6), rep(0, 6))
xyz2 <- spd$xyz.convert(seq(0, 10, by=2), rep(y0, 6), rep(10, 6))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

在xyz空间中使用内置的xyz坐标转换函数匹配网格时,首先对这些点进行采样,然后在它们之间映射片段,生成网格:

enter image description here