我觉得在R中创建美观的3D表面很有挑战性。我熟悉解决方案(persp
,image
,wireframe
,lattice
,{{1和SO)中的其他问题中的其他几个解决方案,但结果并不好。
是否可以像在MATLAB中一样在R中创建3D表面图?
rgl
情节现代,色彩鲜艳,美观,代码语法非常易读。
这可能在基础R?
答案 0 :(得分:17)
jet.colors
是其中一个matlab调色板的R答案:
points = seq(-2, 0, length=20)
#create a grid
XY = expand.grid(X=points,Y=-points)
# A z-function
Zf <- function(X,Y){
2./exp((X-.5)^2+Y^2)-2./exp((X+.5)^2+Y^2);
}
# populate a surface
Z <- Zf(XY$X, XY$Y)
zlim <- range(Z)
zlen <- zlim[2] - zlim[1] + 1
jet.colors <- # function from grDevices package
colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan",
"#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000"))
colorzjet <- jet.colors(100) # 100 separate color
require(rgl)
open3d()
rgl.surface(x=points, y=matrix(Z,20),
coords=c(1,3,2),z=-points,
color=colorzjet[ findInterval(Z, seq(min(Z), max(Z), length=100))] )
axes3d()
rgl.snapshot("copyMatlabstyle.png")
我承认,让颜色与“Z轴”(实际上是rgl y轴)对齐似乎非常不直观。如果你想要Matlab提供的闪亮的镜面反射效果,你可以使用照明角度。
您还可以添加或删除灯光:
clear3d(type = "lights")
light3d(theta=0, phi=0)
light3d(theta=0, phi=0) # twice as much light.
之后:
grid3d("x")
grid3d("y")
grid3d("z")
rgl.snapshot("copyMatlabstyle3.png")
你可以将y-grid放在表面“后面”:
grid3d("y+")
对axes3d
或axis3d
来电的类似调整可能会移动音阶的位置。
有关更多示例,请查看http://rgm3.lab.nig.ac.jp/RGM/R_image_list并搜索“plot3d”,其中会显示查看Karline Soetaert的plot3D包装插图,{{ 3}} R2BayesX::plot3d
函数的示例,
答案 1 :(得分:5)
这可能不会做你想要的一切,但我发布它是为了吸引更好的答案。
X <- Y <- seq(-2, 0, length.out= 20)
Z <- outer(X,Y,
function(X,Y) 2/exp((X-.5)^2+Y^2)-2/exp((X+.5)^2+Y^2))
cc <- colorRamp(rev(rainbow(10)))
Zsc <- (Z-min(Z))/diff(range(Z))
rgbvec2col <- function(x) do.call(rgb,c(as.list(x),list(max=255)))
colvec <- apply(cc(Zsc),1,rgbvec2col)
library(rgl)
surface3d(X,Y,Z,col=colvec)
bbox3d(color=c("white","black"))