繁体   English   中英

如何创建3D - MATLAB样式 - R中的表面图

[英]How to create 3D - MATLAB style - surface plots in R

我觉得在R中创建美观的3D表面很有挑战性。我熟悉解决方案( perspimagewireframelatticergl以及SO中其他问题中的其他几种解决方案),但结果并不好。

是否可以像在MATLAB中一样在R中创建3D曲面图?

在此输入图像描述

Here is the MATLAB code
    % Create a grid of x and y points
    points = linspace(-2, 0, 20);
    [X, Y] = meshgrid(points, -points);

    % Define the function Z = f(X,Y)
    Z = 2./exp((X-.5).^2+Y.^2)-2./exp((X+.5).^2+Y.^2);

    % "phong" lighting is good for curved, interpolated surfaces. "gouraud"
    % is also good for curved surfaces
    surf(X, Y, Z); view(30, 30);
    shading interp;
    light;
    lighting phong;
    title('lighting phong', 'FontName', 'Courier', 'FontSize', 14);

情节现代,色彩鲜艳,美观,代码语法非常易读。

这可能在基地R?

jet.colors是其中一个matlab调色板的R-answer:

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")

CopyMatlab.style.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+")

axes3daxis3d调用的类似调整可以移动比例的位置。

有关更多示例,请查看 http://rgm3.lab.nig.ac.jp/RGM/R_image_list并搜索“plot3d”,其中显示了 R2BayesX::plot3d函数的示例,请 R2BayesX::plot3d Karline Soetaert的plot3D包装插图, “ 50种绘制火山的方法“

这可能不会做你想要的一切,但我发布它是为了吸引更好的答案。

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"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM