2011-12-22 56 views
3

我一直在研究R中一個相當複雜的圖表。我有一個線框,其中有一個曲面,點分佈在X,Y,Z空間中。在表面之下和之上)。在R中使用點陣和線框在曲面下創建點「外觀」

問題是,情節不會「看起來」像他們在表面之下。

我想弄清楚如何最好地可視化這個圖表,使點看起來在表面下。對於線框&雲一些示例代碼來自這裏:R-List Posting

在示例代碼:

library(lattice) 
surf <- 
expand.grid(x = seq(-pi, pi, length = 50), 
      y = seq(-pi, pi, length = 50)) 

surf$z <- 
with(surf, { 
    d <- 3 * sqrt(x^2 + y^2) 
    exp(-0.02 * d^2) * sin(d) 
}) 

g <- surf 

pts <- data.frame(x =rbind(2,2,2), y=rbind(-2,-2,-2), z=rbind(.5,0,-.5)) 

wireframe(z ~ x * y, g, aspect = c(1, .5), 
     drape=TRUE, 
     scales = list(arrows = FALSE), 
     pts = pts, 
     panel.3d.wireframe = 
     function(x, y, z, 
       xlim, ylim, zlim, 
       xlim.scaled, ylim.scaled, zlim.scaled, 
       pts, 
       ...) { 
      panel.3dwire(x = x, y = y, z = z, 
         xlim = xlim, 
         ylim = ylim, 
         zlim = zlim, 
         xlim.scaled = xlim.scaled, 
         ylim.scaled = ylim.scaled, 
         zlim.scaled = zlim.scaled, 
         ...) 
      xx <- 
       xlim.scaled[1] + diff(xlim.scaled) * 
        (pts$x - xlim[1])/diff(xlim) 
      yy <- 
       ylim.scaled[1] + diff(ylim.scaled) * 
        (pts$y - ylim[1])/diff(ylim) 
      zz <- 
       zlim.scaled[1] + diff(zlim.scaled) * 
        (pts$z - zlim[1])/diff(zlim) 
      panel.3dscatter(x = xx, 
          y = yy, 
          z = zz, 
          xlim = xlim, 
          ylim = ylim, 
          zlim = zlim, 
          xlim.scaled = xlim.scaled, 
          ylim.scaled = ylim.scaled, 
          zlim.scaled = zlim.scaled, 
          ...) 
     }) 

Screen Capture

看我的例子,在點的點是在實際的垂直線其中X,Y =(2,-2),z從.5到-5。

但是,在我眼中,第三點看起來並不像表面之下,看起來像座標爲(2,-3,0)。

這只是我的眼睛誤解?

有沒有人有關於如何讓我的觀點看起來更「3D」的建議?也許是通過在表面上使用某種透明度來使點看起來像「表面下」的顏色?

我試着讓點的顏色不同(表面下方是紅色,表面下方是藍色),但這對圖形沒有多大幫助。

+0

這將是更直接使用RGL包,裏面有透明,採光充分支持,以及一個場面,對象是已知的建設在特定曲面的前面或後面 – 2011-12-22 18:21:11

+0

如何將上面的代碼轉換爲使用rgl?我以前沒有用過它.. – user918967 2011-12-22 18:24:22

+0

嗨,本,我完全被rgl搞糊塗了。坦率地說,我不知道從哪裏開始。你可以給我一些關於移動到rgl的指針嗎?謝謝 ! – user918967 2011-12-22 19:29:50

回答

5

這可能讓你開始:

library(emdbook) 
sfun <- function(x,y) { 
    d <- 3 * sqrt(x^2 + y^2) 
    exp(-0.02 * d^2) * sin(d) 
} 

cc <- curve3d(sfun(x,y),xlim=c(-pi,pi),ylim=c(-pi,pi),n=c(50,50), 
     sys3d="rgl") 

colvec <- colorRampPalette(c("pink","white","lightblue"))(100) 
with(cc,persp3d(x,y,z,col=colvec[cut(z,100)],alpha=0.5)) 
pts <- data.frame(x=c(2,2,2), y=c(-2,-2,-2), z=c(.5,0,-.5)) 
with(pts,spheres3d(x,y,z,col="blue",radius=0.1)) 
rgl.snapshot("rgltmp1.png") 

enter image description here