On Fri, Apr 9, 2010 at 1:46 PM, array chip <arrayprof...@yahoo.com> wrote:
> David,
>
> Thanks for the 2 previous posts from Sarkar. Actually, I am now one step 
> closer. I am now able
> to remove the 3 outer lines of the bounding box using par.box argument, even 
> Sarkar said in
> his 2008 post that par.box() does not control different boundaries, so maybe 
> it was fixed.
>
> Replacing "par.box=list(lwd=2)" in my original code with "par.box=list(lwd=2,
> col=c(1,1,1,NA,1,1,NA,NA,1))" will now remove the 3 outer lines of the 
> bounding box. The
> only thing missing here is the 3 inner lines of the box (behind the plot) are 
> dashed lines,
> not solid. And par.box argument only control those 9 visible lines of the 
> bounding box.
>
> As for how to draw grid lines onto the 3 surfaces, I still have no clue. But 
> as you pointed
> out Sarkar indicated in his 2007 post that it might be possible.

Sorry I haven't had time to take a stab at this till now.

As David has pointed out, the trick is to get 3d versions of the grid
lines, and project them using ltransform3dto3d(), just as in the
projected contour lines example. The code given below is tedious but
conceptually straightforward. It may need some manual tweaking to get
the right faces, depending on the value of 'screen'.

 rescale <- function(x, from, to)
{
    ans <- min(to) + abs(diff(to)) * (x - min(from)) / abs(diff(from))
    ans[ans > min(to) & ans < max(to)]
}

panel.3dgrid <-
    function(rot.mat, distance,
             xlim, ylim, zlim,
             xlim.scaled, ylim.scaled, zlim.scaled,
             zero.scaled,
             ...)
{
    xgrid <- rescale(pretty(xlim), xlim, xlim.scaled)
    ygrid <- rescale(pretty(ylim), ylim, ylim.scaled)
    zgrid <- rescale(pretty(zlim), zlim, zlim.scaled)
    ## helper functions
    drawGridSegments <- function(xyz1, xyz2)
    {
        m1 <- ltransform3dto3d(t(xyz1), rot.mat, distance)
        m2 <- ltransform3dto3d(t(xyz2), rot.mat, distance)
        panel.segments(m1[1,], m1[2,], m2[1,], m2[2,], col = "grey")
    }
    drawBox <- function(xyz1, xyz2)
    {
        m1 <- ltransform3dto3d(t(xyz1), rot.mat, distance)
        m2 <- ltransform3dto3d(t(xyz2), rot.mat, distance)
        panel.segments(m1[1,], m1[2,], m2[1,], m2[2,], col = "black")
    }
    ## xgrid * ygrid * min(z) (bottom)
    drawGridSegments(expand.grid(x = xgrid, y = ylim.scaled[1], z =
zlim.scaled[1]),
                     expand.grid(x = xgrid, y = ylim.scaled[2], z =
zlim.scaled[1]))
    drawGridSegments(expand.grid(x = xlim.scaled[1], y = ygrid, z =
zlim.scaled[1]),
                     expand.grid(x = xlim.scaled[2], y = ygrid, z =
zlim.scaled[1]))
    ## max(x) * ygrid * zgrid
    drawGridSegments(expand.grid(x = xlim.scaled[2], y = ygrid, z =
zlim.scaled[1]),
                     expand.grid(x = xlim.scaled[2], y = ygrid, z =
zlim.scaled[2]))
    drawGridSegments(expand.grid(x = xlim.scaled[2], y =
ylim.scaled[1], z = zgrid),
                     expand.grid(x = xlim.scaled[2], y =
ylim.scaled[2], z = zgrid))
    ## xgrid * max(y) * zgrid
    drawGridSegments(expand.grid(x = xgrid, y = ylim.scaled[2], z =
zlim.scaled[1]),
                     expand.grid(x = xgrid, y = ylim.scaled[2], z =
zlim.scaled[2]))
    drawGridSegments(expand.grid(x = xlim.scaled[1], y =
ylim.scaled[2], z = zgrid),
                     expand.grid(x = xlim.scaled[2], y =
ylim.scaled[2], z = zgrid))
    ## boxes around the faces
    drawBox(expand.grid(x = xlim.scaled[1], y = ylim.scaled, z =
zlim.scaled[1]),
            expand.grid(x = xlim.scaled[2], y = ylim.scaled, z =
zlim.scaled[1]))
    drawBox(expand.grid(x = xlim.scaled, y = ylim.scaled[1], z =
zlim.scaled[1]),
            expand.grid(x = xlim.scaled, y = ylim.scaled[2], z =
zlim.scaled[1]))
    drawBox(expand.grid(x = xlim.scaled[2], y = ylim.scaled, z =
zlim.scaled[1]),
            expand.grid(x = xlim.scaled[2], y = ylim.scaled, z =
zlim.scaled[2]))
    drawBox(expand.grid(x = xlim.scaled[2], y = ylim.scaled[1], z =
zlim.scaled),
            expand.grid(x = xlim.scaled[2], y = ylim.scaled[2], z =
zlim.scaled))
    drawBox(expand.grid(x = xlim.scaled[1], y = ylim.scaled[2], z =
zlim.scaled),
            expand.grid(x = xlim.scaled[2], y = ylim.scaled[2], z =
zlim.scaled))
    drawBox(expand.grid(x = xlim.scaled, y = ylim.scaled[2], z =
zlim.scaled[1]),
            expand.grid(x = xlim.scaled, y = ylim.scaled[2], z =
zlim.scaled[2]))
}

cloud(Sepal.Length ~ Petal.Length * Petal.Width,
      data = iris, cex = .8,
      groups = Species,
      par.box = list(col = "transparent"),
      screen = list(z = 20, x = -70, y = 3),
      panel.3d.cloud = function(...) {
          panel.3dgrid(...)
          panel.3dscatter(...)
      },
      par.settings = list(axis.line = list(col = "transparent")),
      scales = list(arrows = FALSE, col = "black"))


wireframe(volcano, shade = TRUE,
          par.box = list(col = "transparent"),
          screen = list(z = 20, x = -70, y = 3),
          panel.3d.wireframe = function(...) {
              panel.3dgrid(...)
              panel.3dwire(...)
          },
          par.settings = list(axis.line = list(col = "transparent")),
          scales = list(arrows = FALSE, col = "black"))

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to