• R语言
  • wireframe如何在背面加网格线

用wireframe画图,问题:

1. 如何在四方体的六个面中的某几个面加网格线?比如在寺方体的后面。类似于xyplot里面的panel.grid函数

2. 如何把四方体的某几个边线减掉,比如把下图中的正对读者的这个角所对应的三个边去掉。

<br />
g <- expand.grid(x = 1:10, y = 5:15, gr = 1:2)<br />
g$z <- log((g$x^g$g + g$y^2) * g$gr)<br />
wireframe(z ~ x * y, data = g, groups = gr,<br />
          scales = list(arrows = FALSE),<br />
          drape = TRUE, colorkey = TRUE,alpha.regions=0.6,<br />
          screen = list(z = 30, x = -60))<br />
</p>

谢谢

[attachment=212089,759]

找到解决办法了:

http://tolstoy.newcastle.edu.au/R/e10/help/10/05/3533.html

</p>
<p>rescale <- function(x, from, to)<br />
{</p>
<p>    ans <- min(to) + abs(diff(to)) * (x - min(from)) / abs(diff(from))<br />
    ans[ans > min(to) & ans < max(to)]<br />
}</p>
<p>panel.3dgrid <-</p>
<p>    function(rot.mat, distance,</p>
<p>             xlim, ylim, zlim,<br />
             xlim.scaled, ylim.scaled, zlim.scaled,<br />
             zero.scaled,<br />
             ...)</p>
<p>{<br />
    xgrid <- rescale(pretty(xlim), xlim, xlim.scaled)<br />
    ygrid <- rescale(pretty(ylim), ylim, ylim.scaled)<br />
    zgrid <- rescale(pretty(zlim), zlim, zlim.scaled)<br />
    ## helper functions<br />
    drawGridSegments <- function(xyz1, xyz2)     {<br />
        m1 <- ltransform3dto3d(t(xyz1), rot.mat, distance)<br />
        m2 <- ltransform3dto3d(t(xyz2), rot.mat, distance)<br />
        panel.segments(m1[1,], m1[2,], m2[1,], m2[2,], col = "grey")<br />
    }<br />
    drawBox <- function(xyz1, xyz2)<br />
    {<br />
        m1 <- ltransform3dto3d(t(xyz1), rot.mat, distance)<br />
        m2 <- ltransform3dto3d(t(xyz2), rot.mat, distance)<br />
        panel.segments(m1[1,], m1[2,], m2[1,], m2[2,], col = "black")<br />
    }<br />
    ## xgrid * ygrid * min(z) (bottom)<br />
    drawGridSegments(expand.grid(x = xgrid, y = ylim.scaled[1], z = zlim.scaled[1]),<br />
                     expand.grid(x = xgrid, y = ylim.scaled[2], z =<br />
zlim.scaled[1]))<br />
    drawGridSegments(expand.grid(x = xlim.scaled[1], y = ygrid, z = zlim.scaled[1]),</p>
<p>                     expand.grid(x = xlim.scaled[2], y = ygrid, z =<br />
zlim.scaled[1]))<br />
    ## max(x) * ygrid * zgrid<br />
    drawGridSegments(expand.grid(x = xlim.scaled[2], y = ygrid, z = zlim.scaled[1]),</p>
<p>                     expand.grid(x = xlim.scaled[2], y = ygrid, z =<br />
zlim.scaled[2]))<br />
    drawGridSegments(expand.grid(x = xlim.scaled[2], y = ylim.scaled[1], z = zgrid),</p>
<p>                     expand.grid(x = xlim.scaled[2], y =<br />
ylim.scaled[2], z = zgrid))<br />
    ## xgrid * max(y) * zgrid<br />
    drawGridSegments(expand.grid(x = xgrid, y = ylim.scaled[2], z = zlim.scaled[1]),</p>
<p>                     expand.grid(x = xgrid, y = ylim.scaled[2], z =<br />
zlim.scaled[2]))<br />
    drawGridSegments(expand.grid(x = xlim.scaled[1], y = ylim.scaled[2], z = zgrid),</p>
<p>                     expand.grid(x = xlim.scaled[2], y =<br />
ylim.scaled[2], z = zgrid))<br />
    ## boxes around the faces<br />
    drawBox(expand.grid(x = xlim.scaled[1], y = ylim.scaled, z = zlim.scaled[1]),</p>
<p>            expand.grid(x = xlim.scaled[2], y = ylim.scaled, z = zlim.scaled[1]))</p>
<p>    drawBox(expand.grid(x = xlim.scaled, y = ylim.scaled[1], z = zlim.scaled[1]),</p>
<p>            expand.grid(x = xlim.scaled, y = ylim.scaled[2], z = zlim.scaled[1]))</p>
<p>    drawBox(expand.grid(x = xlim.scaled[2], y = ylim.scaled, z = zlim.scaled[1]),</p>
<p>            expand.grid(x = xlim.scaled[2], y = ylim.scaled, z = zlim.scaled[2]))</p>
<p>    drawBox(expand.grid(x = xlim.scaled[2], y = ylim.scaled[1], z = zlim.scaled),</p>
<p>            expand.grid(x = xlim.scaled[2], y = ylim.scaled[2], z = zlim.scaled))</p>
<p>    drawBox(expand.grid(x = xlim.scaled[1], y = ylim.scaled[2], z = zlim.scaled),</p>
<p>            expand.grid(x = xlim.scaled[2], y = ylim.scaled[2], z = zlim.scaled))</p>
<p>    drawBox(expand.grid(x = xlim.scaled, y = ylim.scaled[2], z = zlim.scaled[1]),</p>
<p>            expand.grid(x = xlim.scaled, y = ylim.scaled[2], z = zlim.scaled[2]))<br />
}</p>
<p>cloud(Sepal.Length ~ Petal.Length * Petal.Width,</p>
<p>      data = iris, cex = .8,<br />
      groups = Species,<br />
      par.box = list(col = "transparent"),<br />
      screen = list(z = 20, x = -70, y = 3),<br />
      panel.3d.cloud = function(...) {<br />
          panel.3dgrid(...)<br />
          panel.3dscatter(...)<br />
      },<br />
      par.settings = list(axis.line = list(col = "transparent")),<br />
      scales = list(arrows = FALSE, col = "black"))</p>
<p>wireframe(volcano, shade = TRUE,<br />
          par.box = list(col = "transparent"),<br />
          screen = list(z = 20, x = -70, y = 3),<br />
          panel.3d.wireframe = function(...) {<br />
              panel.3dgrid(...)<br />
              panel.3dwire(...)<br />
          },<br />
          par.settings = list(axis.line = list(col = "transparent")),<br />
          scales = list(arrows = FALSE, col = "black"))<br />
</p>

[attachment=212104,761]

回复 第2楼 的 pengchy:这 .. 内牛满面, 情何以堪 ..

如果要手工加reference grid, 我觉得剩下9条边的lty和col需要好好设计一下才行, 不然看起来会像下面这样感觉怪怪的.

[attachment=212164,767]

所以其实我挺支持原来一个简单盒子的设计 ..