On 30 Jul 2010, at 19:22, Ian Bentley wrote:

> I've got two persp plots with Identical X and Y's, and I'd like to plot them
> on the same graph, so that it is obvious where one plot is above the other.
> I can't find any mention of this anywhere.  Do I need to use wireframe?

You can do it with wireframe() from the lattice package if you put in some 
manual tweaking and if you can live with simple wireframe plots in b/w (since 
the lattice 3D functions don't have a Z-buffer to handle polygon intersections 
correctly).  Such plots tend to get rather confusing, but stereographic viewing 
usually helps.

Animated 3D with rgl is much nicer in general, but the wireframe() trick allows 
you to produce high-quality b/w printouts.

The example below generates a stereographic plot of two intersecting surfaces 
for cross-eyed viewing (i.e. you have to look at the _left_ image with your 
_right_ eye and vice versa).

Hope this helps,
Stefan





library("lattice")

## set up viewport (turn=rectascension, elevation=declination, stereo=angle 
between eyes, distance=1/d)
turn <- 30
elevation <- 25
stereo <- 4
distance <- .2

## other display and graph properties 
xlim <- c(-4, 4)           # plot range on x-axis, y-axis and z-axis
ylim <- c(-4, 4)
zlim <- c(-2, 18)
grid <- 25                 # number of grid points for wireframe surfaces
coarse.grid <- 10          # number of grid points for coarser wireframe surface
zoom <- 1                  # zoom factor for graphs (to fit labels into panels)

view.left <- list(x=-90, y=turn-stereo/2, x=elevation)    # for RIGHT eye
view.right <- list(x=-90, y=turn+stereo/2, x=elevation)   # for LEFT eye
pos.left <- c(0,0,0.5,1)
pos.right <- c(0.5,0,1,1)

trellis.device(width=12, height=6, color=FALSE)
trellis.par.set("fontsize", list(text=16, points=10))
trellis.par.set("superpose.symbol", list(pch=20,cex=0.5))
trellis.par.set("axis.line", list(col="transparent")) # avoids frames around 
panels

grid1 <- expand.grid(x=seq(xlim[1],xlim[2],length=grid), 
y=seq(ylim[1],ylim[2],length=grid))
grid2 <- expand.grid(x=seq(xlim[1],xlim[2],length=coarse.grid), 
y=seq(ylim[1],ylim[2],length=coarse.grid))

# construct trellis objects for wireframe plots of different surfaces
wf1L <- wireframe(I(x*x + y*y) ~ x * y, data=grid1, screen=view.left, 
col.regions="transparent", distance=distance, zoom=zoom, xlim=xlim, ylim=ylim, 
zlim=zlim, xlab="x", ylab="y", zlab="z") # elevation of first surface (fine 
grid)
wf1R <- wireframe(I(x*x + y*y) ~ x * y, data=grid1, screen=view.right, 
col.regions="transparent", distance=distance, zoom=zoom, xlim=xlim, ylim=ylim, 
zlim=zlim, xlab="x", ylab="y", zlab="z") # elevation of first surface (fine 
grid)

wf2L <- wireframe(I(8 + 2*x) ~ x * y, data=grid2, screen=view.left, 
col.regions="transparent", distance=distance, zoom=zoom, xlim=xlim, ylim=ylim, 
zlim=zlim, xlab="x", ylab="y", zlab="z") # elevation of first surface (fine 
grid)
wf2R <- wireframe(I(8 + 2*x) ~ x * y, data=grid2, screen=view.right, 
col.regions="transparent", distance=distance, zoom=zoom, xlim=xlim, ylim=ylim, 
zlim=zlim, xlab="x", ylab="y", zlab="z") # elevation of first surface (fine 
grid)

# now overplot all four wireframes
print(wf1L, position=pos.left, more=TRUE)
print(wf1R, position=pos.right, more=TRUE)
print(wf2L, position=pos.left, more=TRUE)
print(wf2R, position=pos.right, more=FALSE)

______________________________________________
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