根据 3 个变量的特定组合在 R 中绘制 3d 曲面或 ploygon
Plot 3d surface or ploygon in R based on specific combinations of 3 variables
我正在尝试根据 return 某些值的 3 个变量的组合来制作带有边界或区域的 3D 散点图。每个变量的范围都在 0:1
之间,并组合起来形成一个范围在 -1:1
之间的索引,如下所示:
f(x,y,z) = (x*y)-z
我想创建一个可视化表示,突出显示 return 特定索引值的所有变量组合。例如,我可以使用 scatterplot3d
轻松显示 index > 0
的那些变量(rgl
也可以):
# Create imaginary dataset of 50 observations for each variable
x<-runif(50,0,1)
y<-runif(50,0,1)
z<-runif(50,0,1)
# Create subset where f(x,y,z) > 0
x1<-y1<-z1<-1
for (i in 1:length(x)){ if ((x[i]*y[i])-z[i] > 0) {
x1<-rbind(x1, x[i])
y1<-rbind(y1, y[i])
z1<-rbind(z1, z[i])}
}
s3d<-scatterplot3d(x,y,z) # Plot entire dataset
s3d$points3d(x1,y1,z1,pch=19, col="red") # Highlight subset where f(x,y,z) > 0
这给了我下图:
似乎很直观,应该有一种简单的方法来绘制表面(从 top/right/back 延伸到 bottom/left/front)将子集与其余数据分开,或者 volume/3D 这些地块所在的区域。例如。我的第一直觉是使用 surface3d
、persp3d
或 planes3d
之类的东西。然而,到目前为止所有的尝试都只产生了错误信息。大多数解决方案似乎使用某种形式的 z<-lm(y~x)
但我显然需要像 q<-func((x*y)-z)
的所有值 x
, y
和 z
产生 q > 0
.
我知道我可以计算极值点并将它们用作 3D 多边形的顶点,但这似乎太过分了 "manual"。感觉就像我忽略了一些相当简单和明显的东西。我在 Stack 上看过许多类似的问题,但似乎找不到适合我的特定问题的问题。如果我遗漏了任何问题并且已经回答了这个问题,请给我指出正确的方向!
第一个想法是看看 scatterplot3d 中的现有函数是否可以解决这个问题,但我认为不能:
my.lm <- lm(z ~ I(x) * I(y)+0)
s3d$plane3d(my.lm, lty.box = "solid", col="red")
pkg:scatterplot3d
并没有真正的 surface3d
功能,因此您需要选择一个提供该功能的软件包;说 'rgl'、'lattice' 或 'plot3d'。他们中的任何一个都应该提供所需的设施。
这是一个交互式 3D 图的建议,它基于 Winston Chang "R Graphics Cookbook" 中的示例。
set.seed(4321)
library(rgl)
interleave <- function(v1,v2) as.vector(rbind(v1,v2))
x <- runif(50)
y <- runif(50)
z <- runif(50)
plot3d(x, y, z, type="s", size=0.6, col=(2+(x*y<z)))
x0 <- y0 <- seq(0, 1, 0.1)
surface3d(x0, y0, outer(x0, y0), alpha=0.4) #plot the surface f(x,y)=x*y
x1 <- x[x * y > z] #select subset that is below the separating surface
y1 <- y[x * y > z]
z1 <- z[x * y > z]
segments3d(interleave(x1, x1), #highlight the distance of the points below the surface
interleave(y1, y1),
interleave(x1 * y1, z1), col="red", alpha=0.4)
如果你不喜欢红线,只想要表面和彩色点,这就足够了:
plot3d(x,y,z,type="s",size=0.6,col=(2+(x*y<z)))
x0 <- y0 <- seq(0,1,0.1)
surface3d(x0,y0,outer(x0,y0),alpha=0.4)
此表示是否提供了您想突出显示的信息?
我正在尝试根据 return 某些值的 3 个变量的组合来制作带有边界或区域的 3D 散点图。每个变量的范围都在 0:1
之间,并组合起来形成一个范围在 -1:1
之间的索引,如下所示:
f(x,y,z) = (x*y)-z
我想创建一个可视化表示,突出显示 return 特定索引值的所有变量组合。例如,我可以使用 scatterplot3d
轻松显示 index > 0
的那些变量(rgl
也可以):
# Create imaginary dataset of 50 observations for each variable
x<-runif(50,0,1)
y<-runif(50,0,1)
z<-runif(50,0,1)
# Create subset where f(x,y,z) > 0
x1<-y1<-z1<-1
for (i in 1:length(x)){ if ((x[i]*y[i])-z[i] > 0) {
x1<-rbind(x1, x[i])
y1<-rbind(y1, y[i])
z1<-rbind(z1, z[i])}
}
s3d<-scatterplot3d(x,y,z) # Plot entire dataset
s3d$points3d(x1,y1,z1,pch=19, col="red") # Highlight subset where f(x,y,z) > 0
这给了我下图:
似乎很直观,应该有一种简单的方法来绘制表面(从 top/right/back 延伸到 bottom/left/front)将子集与其余数据分开,或者 volume/3D 这些地块所在的区域。例如。我的第一直觉是使用 surface3d
、persp3d
或 planes3d
之类的东西。然而,到目前为止所有的尝试都只产生了错误信息。大多数解决方案似乎使用某种形式的 z<-lm(y~x)
但我显然需要像 q<-func((x*y)-z)
的所有值 x
, y
和 z
产生 q > 0
.
我知道我可以计算极值点并将它们用作 3D 多边形的顶点,但这似乎太过分了 "manual"。感觉就像我忽略了一些相当简单和明显的东西。我在 Stack 上看过许多类似的问题,但似乎找不到适合我的特定问题的问题。如果我遗漏了任何问题并且已经回答了这个问题,请给我指出正确的方向!
第一个想法是看看 scatterplot3d 中的现有函数是否可以解决这个问题,但我认为不能:
my.lm <- lm(z ~ I(x) * I(y)+0)
s3d$plane3d(my.lm, lty.box = "solid", col="red")
pkg:scatterplot3d
并没有真正的 surface3d
功能,因此您需要选择一个提供该功能的软件包;说 'rgl'、'lattice' 或 'plot3d'。他们中的任何一个都应该提供所需的设施。
这是一个交互式 3D 图的建议,它基于 Winston Chang "R Graphics Cookbook" 中的示例。
set.seed(4321)
library(rgl)
interleave <- function(v1,v2) as.vector(rbind(v1,v2))
x <- runif(50)
y <- runif(50)
z <- runif(50)
plot3d(x, y, z, type="s", size=0.6, col=(2+(x*y<z)))
x0 <- y0 <- seq(0, 1, 0.1)
surface3d(x0, y0, outer(x0, y0), alpha=0.4) #plot the surface f(x,y)=x*y
x1 <- x[x * y > z] #select subset that is below the separating surface
y1 <- y[x * y > z]
z1 <- z[x * y > z]
segments3d(interleave(x1, x1), #highlight the distance of the points below the surface
interleave(y1, y1),
interleave(x1 * y1, z1), col="red", alpha=0.4)
如果你不喜欢红线,只想要表面和彩色点,这就足够了:
plot3d(x,y,z,type="s",size=0.6,col=(2+(x*y<z)))
x0 <- y0 <- seq(0,1,0.1)
surface3d(x0,y0,outer(x0,y0),alpha=0.4)
此表示是否提供了您想突出显示的信息?