R:4D图,x,y,z,颜色

你能给我一个例子,说明如何使用rgl在轴x,y和z上绘制3个variables,以及使用不同颜色绘制第四个variables?

谢谢

根据单独的function使用persp和color的组合。 以下是一些示例代码:

 ## Create a simple surface f(x,y) = -x^2 - y^2 ## Colour the surface according to x^2 only nx = 31; ny = 31 x = seq(-1, 1, length = nx) y = seq(-1, 1, length = ny) z = outer(x, y, function(x,y) -x^2 -y^2) ## Fourth dim z_col = outer(x, y, function(x,y) x^2) ## Average the values at the corner of each facet ## and scale to a value in [0, 1]. We will use this ## to select a gray for colouring the facet. hgt = 0.25 * (z_col[-nx,-ny] + z_col[-1,-ny] + z_col[-nx,-1] + z_col[-1,-1]) hgt = (hgt - min(hgt))/ (max(hgt) - min(hgt)) ## Plot the surface with the specified facet colours. persp(x, y, z, col = gray(1 - hgt)) persp(x, y, z, col=cm.colors(32)[floor(31*hgt+1)], theta=-35, phi=10) 

这给了:

示例输出

RGL

在rgl库中使用上述技术相当简单:

 library(rgl) ## Generate the data using the above commands ## New window open3d() ## clear scene: clear3d("all") ## setup env: bg3d(color="#887777") light3d() surface3d(x, y, z, color=cm.colors(32)[floor(31*hgt+1)], alpha=0.5) 

在plot3d中有一个例子,如果您正在讨论在三维空间中绘制点并着色它们:

 x <- sort(rnorm(1000)) y <- rnorm(1000) z <- rnorm(1000) + atan2(x,y) plot3d(x, y, z, col=rainbow(1000)) 

但是如果你的意思是用第四个variables(比如一个分组variables)对点进行着色,那么我们可以通过创build一个分组variables来修改上面的例子

 grp <- gl(5, 200) ## 5 groups 200 members each ## now select the colours we want cols <- 1:5 ## Now plot plot3d(x, y, z, col=cols[grp]) 

好的,这是你想要的吗?

 X <- 1:10 Y <- 1:10 ## Z is now a 100 row object of X,Y combinations Z <- expand.grid(X = X, Y = Y) ## Add in Z1, which is the 3rd variable ## X,Y,Z1 define the surface, which we colour according to ## 4th variable Z2 Z <- within(Z, { Z1 <- 1.2 + (1.4 * X) + (-1.9 * Y) Z2 <- 1.2 + (1.4 * X) - (1.2 * X^2) + (1.9 * Y) + (-1.3 * Y^2) Z3 <- 1.2 + (1.4 * X) + (-1.9 * Y) + (-X^2) + (-Y^2)}) ## show the data head(Z) ## Set-up the rgl device with(Z, plot3d(X, Y, Z1, type = "n")) ## Need a scale for Z2 to display as colours ## Here I choose 10 equally spaced colours from a palette cols <- heat.colors(10) ## Break Z2 into 10 equal regions cuts <- with(Z, cut(Z2, breaks = 10)) ## Add in the surface, colouring by Z2 with(Z, surface3d(1:10,1:10, matrix(Z1, ncol = 10), color = cols[cuts], back = "fill")) with(Z, points3d(X, Y, Z1, size = 5)) ## show grid X,Y,Z1 

这里是平面Z1是弯曲的( Z3 )的修改。

 ## Set-up the rgl device plotting Z3, a curved surface with(Z, plot3d(X, Y, Z3, type = "n")) with(Z, surface3d(1:10,1:10, matrix(Z3, ncol = 10), color = cols[cuts], back = "fill")) 

我所做的获得Z2的细节可能并不重要,但我试图得到像你链接的图。

如果我还没有得到你想要的东西,你可以用一些示例数据编辑你的Q,并给我们一个更好的想法,你想要什么?

HTH

看看example(points3d)

r3d帮助页面显示如何绘制坐标轴。

 x <- c(0, 10, 0, 0) y <- c(0, 0, 100, 0) z <- c(0, 0, 0, 1) i <- c(1,2,1,3,1,4) labels <- c("Origin", "X", "Y", "Z") text3d(x,y,z,labels) segments3d(x[i],y[i],z[i]) 

现在你添加一些要点

 dfr <- data.frame(x = 1:10, y = (1:10)^2, z = runif(10), col = rainbow(10)) with(dfr, points3d(x, y, z, col = col))