library(plot3D)

#Examples
# run all examples
## Not run:
example(persp3D)
## 
## prsp3D> # save plotting parameters
## prsp3D>  pm <- par("mfrow")
## 
## prsp3D> ## =======================================================================
## prsp3D> ## Ribbon, persp, color keys, facets
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 2))
## 
## prsp3D> # simple, no scaling,
## prsp3D>  persp3D(z = volcano, main = "volcano", clab = c("height", "m"))
## 
## prsp3D> # keep ratios between x- and y (scale = FALSE) 
## prsp3D> # change ratio between x- and z (expand)
## prsp3D>  persp3D(z = volcano, x = 1: nrow(volcano), y = 1:ncol(volcano),
## prsp3D+        expand = 0.3, main = "volcano", facets = FALSE, scale = FALSE,
## prsp3D+        clab = "height, m", colkey = list(side = 1, length = 0.5))
## 
## prsp3D> # ribbon, in x--direction
## prsp3D>  V <- volcano[, seq(1, ncol(volcano), by = 3)]  # lower resolution
## 
## prsp3D>  ribbon3D(z = V, colkey = list(width = 0.5, length = 0.5, 
## prsp3D+           cex.axis = 0.8, side = 2), clab = "m")
## 
## prsp3D> # ribbon, in y-direction
## prsp3D>  Vy <- volcano[seq(1, nrow(volcano), by = 3), ]
## 
## prsp3D>  ribbon3D(z = Vy, expand = 0.3, space = 0.3, along = "y", 
## prsp3D+           colkey = list(width = 0.5, length = 0.5, cex.axis = 0.8))

## 
## prsp3D> ## =======================================================================
## prsp3D> ## Several ways to visualise 3-D data
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  x <- seq(-pi, pi, by = 0.2)
## 
## prsp3D>  y <- seq(-pi, pi, by = 0.3)
## 
## prsp3D>  grid <- mesh(x, y)
## 
## prsp3D>  z    <- with(grid, cos(x) * sin(y))
## 
## prsp3D>  par(mfrow = c(2,2))
## 
## prsp3D>  persp3D(z = z, x = x, y = y)
## 
## prsp3D>  persp3D(z = z, x = x, y = y, facets = FALSE, curtain = TRUE)
## 
## prsp3D> # ribbons in two directions and larger spaces
## prsp3D>  ribbon3D(z = z, x = x, y = y, along = "xy", space = 0.3)
## 
## prsp3D>  hist3D(z = z, x = x, y = y, border = "black")

## 
## prsp3D> ## =======================================================================
## prsp3D> ## Contours and images added
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 2))
## 
## prsp3D>  x <- seq(1, nrow(volcano), by = 3)
## 
## prsp3D>  y <- seq(1, ncol(volcano), by = 3) 
## 
## prsp3D>  Volcano <- volcano [x, y]
## 
## prsp3D>  ribbon3D(z = Volcano, contour = TRUE, zlim= c(-100, 200), 
## prsp3D+           image = TRUE)
## 
## prsp3D>  persp3D(z = Volcano, contour = TRUE, zlim= c(-200, 200), image = FALSE)
## 
## prsp3D>  persp3D(z = Volcano, x = x, y = y, scale = FALSE, 
## prsp3D+        contour = list(nlevels = 20, col = "red"), 
## prsp3D+        zlim = c(-200, 200), expand = 0.2,
## prsp3D+        image = list(col = grey (seq(0, 1, length.out = 100))))
## 
## prsp3D>  persp3D(z = Volcano, contour = list(side = c("zmin", "z", "350")), 
## prsp3D+        zlim = c(-100, 400), phi = 20, image = list(side = 350))

## 
## prsp3D> ## =======================================================================
## prsp3D> ## Use of inttype
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 2))
## 
## prsp3D>  persp3D(z = Volcano, shade = 0.5, colkey = FALSE)
## 
## prsp3D>  persp3D(z = Volcano, inttype = 2, shade = 0.5, colkey = FALSE)
## 
## prsp3D>  x <- y <- seq(0, 2*pi, length.out = 10)
## 
## prsp3D>  z <- with (mesh(x, y), cos(x) *sin(y)) + runif(100)
## 
## prsp3D>  cv <- matrix(nrow = 10, 0.5*runif(100))
## 
## prsp3D>  persp3D(x, y, z, colvar = cv)              # takes averages of z
## 
## prsp3D>  persp3D(x, y, z, colvar = cv, inttype = 2) # takes averages of colvar

## 
## prsp3D> ## =======================================================================
## prsp3D> ## Use of inttype with NAs
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 2))
## 
## prsp3D>  VV <- V2 <- volcano[10:15, 10:15]
## 
## prsp3D>  V2[3:4, 3:4] <- NA
## 
## prsp3D>  V2[4, 5] <- NA
## 
## prsp3D>  image2D(V2, border = "black")  # shows true NA region
## 
## prsp3D> # averages of V2, including NAs, NA region larger
## prsp3D>  persp3D(z = VV, colvar = V2, inttype = 1, theta = 0, 
## prsp3D+        phi = 20, border = "black", main = "inttype = 1")
## 
## prsp3D> # extension of VV; NAs unaffected
## prsp3D>  persp3D(z = VV, colvar = V2, inttype = 2, theta = 0, 
## prsp3D+        phi = 20, border = "black", main = "inttype = 2")
## 
## prsp3D> # average of V2, ignoring NA; NA region smaller
## prsp3D>  persp3D(z = VV, colvar = V2, inttype = 3, theta = 0, 
## prsp3D+        phi = 20, border = "black", main = "inttype = 3")

## 
## prsp3D> ## =======================================================================
## prsp3D> ## Use of panel.first
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(1, 1))
## 
## prsp3D> # A function that is called after the axes were drawn
## prsp3D>  panelfirst <- function(trans) {
## prsp3D+     zticks <- seq(100, 180, by = 20)
## prsp3D+     len <- length(zticks)
## prsp3D+     XY0 <- trans3D(x = rep(1, len), y = rep(1, len), z = zticks,
## prsp3D+                    pmat = trans)
## prsp3D+     XY1 <- trans3D(x = rep(1, len), y = rep(61, len), z = zticks,
## prsp3D+                    pmat = trans)
## prsp3D+     segments(XY0$x, XY0$y, XY1$x, XY1$y, lty = 2) 
## prsp3D+     
## prsp3D+     rm <- rowMeans(volcano)             
## prsp3D+     XY <- trans3D(x = 1:87, y = rep(ncol(volcano), 87), 
## prsp3D+                   z = rm, pmat = trans)
## prsp3D+     lines(XY, col = "blue", lwd = 2)
## prsp3D+  }
## 
## prsp3D>  persp3D(z = volcano, x = 1:87, y = 1: 61, scale = FALSE, theta = 10,
## prsp3D+        expand = 0.2, panel.first = panelfirst, colkey = FALSE)

## 
## prsp3D> ## =======================================================================
## prsp3D> ## with / without colvar / facets 
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 2))
## 
## prsp3D>  persp3D(z = volcano, shade = 0.3, col = gg.col(100))
## 
## prsp3D> # shiny colors - set lphi for more brightness
## prsp3D>  persp3D(z = volcano, lighting = TRUE, lphi = 90)
## 
## prsp3D>  persp3D(z = volcano, col = "lightblue", colvar = NULL, 
## prsp3D+    shade = 0.3, bty = "b2")
## 
## prsp3D> # this also works:
## prsp3D> #  persp3D(z = volcano, col = "grey", shade = 0.3)
## prsp3D> 
## prsp3D> # tilted x- and y-coordinates of 'volcano'
## prsp3D>  volcx <- matrix(nrow = 87, ncol = 61, data = 1:87)
## 
## prsp3D>  volcx <- volcx + matrix(nrow = 87, ncol = 61, 
## prsp3D+         byrow = TRUE, data = seq(0., 15, length.out = 61))
## 
## prsp3D>  volcy <- matrix(ncol = 87, nrow = 61, data = 1:61)
## 
## prsp3D>  volcy <- t(volcy + matrix(ncol = 87, nrow = 61, 
## prsp3D+         byrow = TRUE, data = seq(0., 15, length.out = 87)))
## 
## prsp3D>  persp3D(volcano, x = volcx, y = volcy, phi = 80)

## 
## prsp3D> ## =======================================================================
## prsp3D> ## Several persps on one plot
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(1, 1))
## 
## prsp3D>  clim <- range(volcano)
## 
## prsp3D>  persp3D(z = volcano, zlim = c(100, 600), clim = clim, 
## prsp3D+    box = FALSE, plot = FALSE)
## 
## prsp3D>  persp3D(z = volcano + 200, clim = clim, colvar = volcano, 
## prsp3D+        add = TRUE, colkey = FALSE, plot = FALSE)
## 
## prsp3D>  persp3D(z = volcano + 400, clim = clim, colvar = volcano, 
## prsp3D+        add = TRUE, colkey = FALSE)    # plot = TRUE by default

## 
## prsp3D> ## =======================================================================
## prsp3D> ## hist3D
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 2))
## 
## prsp3D>  VV   <- volcano[seq(1, 87, 15), seq(1, 61, 15)]
## 
## prsp3D>  hist3D(z = VV, scale = FALSE, expand = 0.01)
## 
## prsp3D> # transparent colors
## prsp3D>  hist3D(z = VV, scale = FALSE, expand = 0.01, 
## prsp3D+    col = jet.col(100, alpha = 0.3), border = "black")
## 
## prsp3D>  hist3D(z = VV, scale = FALSE, expand = 0.01, facets = FALSE, lwd = 2)
## 
## prsp3D>  hist3D(z = VV, scale = FALSE, expand = 0.01, facets = NA)

## 
## prsp3D> ## =======================================================================
## prsp3D> ## hist3D and ribbon3D with greyish background, rotated, rescaled,...
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 2))
## 
## prsp3D>  hist3D(z = VV, scale = FALSE, expand = 0.01, bty = "g", phi = 20,
## prsp3D+         col = "#0072B2", border = "black", shade = 0.2, ltheta = 90,
## prsp3D+         space = 0.3, ticktype = "detailed", d = 2)
## 
## prsp3D> # extending the ranges
## prsp3D>  plotdev(xlim = c(-0.2, 1.2), ylim = c(-0.2, 1.2), theta = 45)
## 
## prsp3D>  ribbon3D(z = VV, scale = FALSE, expand = 0.01, bty = "g", phi = 20,
## prsp3D+         col = "lightblue", border = "black", shade = 0.2, ltheta = 90,
## prsp3D+         space = 0.3, ticktype = "detailed", d = 2, curtain = TRUE)
## 
## prsp3D>  ribbon3D(z = VV, scale = FALSE, expand = 0.01, bty = "g", phi = 20, zlim = c(95,183),
## prsp3D+         col = "lightblue", lighting = TRUE, ltheta = 50, along = "y",
## prsp3D+         space = 0.7, ticktype = "detailed", d = 2, curtain = TRUE)

## 
## prsp3D> ## =======================================================================
## prsp3D> ## hist3D for a 1-D data set
## prsp3D> ## =======================================================================
## prsp3D> 
## prsp3D>  par(mfrow = c(2, 1))
## 
## prsp3D>  x <- rchisq(1000, df = 4)
## 
## prsp3D>  hs <- hist(x, breaks = 15)
## 
## prsp3D>  hist3D(x = hs$mids, y = 1, z = matrix(ncol = 1, data = hs$density), 
## prsp3D+   bty = "g", ylim = c(0., 2.0), scale = FALSE, expand = 20, 
## prsp3D+   border = "black", col = "white", shade = 0.3, space = 0.1, 
## prsp3D+   theta = 20, phi = 20, main = "3-D perspective")

## 
## prsp3D> # reset plotting parameters
## prsp3D>  par(mfrow = pm)
example(surf3D)
## 
## surf3D> # save plotting parameters
## surf3D>  pm   <- par("mfrow")
## 
## surf3D>  pmar <- par("mar")
## 
## surf3D>  par(mar = c(1, 1, 1, 1))
## 
## surf3D> ## =======================================================================
## surf3D> ## A three-dimensional shape 
## surf3D> ## (ala http://docs.enthought.com/mayavi/mayavi/mlab.html)
## surf3D> ## =======================================================================
## surf3D> 
## surf3D>  par(mfrow = c(2, 2))
## 
## surf3D> # create grid matrices
## surf3D>  X       <- seq(0, pi, length.out = 50)
## 
## surf3D>  Y       <- seq(0, 2*pi, length.out = 50)
## 
## surf3D>  M       <- mesh(X, Y)
## 
## surf3D>  phi     <- M$x
## 
## surf3D>  theta   <- M$y
## 
## surf3D> # x, y and z grids
## surf3D>  r <- sin(4*phi)^3 + cos(2*phi)^3 + sin(6*theta)^2 + cos(6*theta)^4
## 
## surf3D>  x <- r * sin(phi) * cos(theta)
## 
## surf3D>  y <- r * cos(phi)
## 
## surf3D>  z <- r * sin(phi) * sin(theta)
## 
## surf3D> # full colored image
## surf3D>  surf3D(x, y, z, colvar = y, colkey = FALSE, shade = 0.5,
## surf3D+         box = FALSE, theta = 60)
## 
## surf3D> # same, but just facets
## surf3D>  surf3D(x, y, z, colvar = y, colkey = FALSE, box = FALSE, 
## surf3D+         theta = 60, facets = FALSE)
## 
## surf3D> # with colors and border, AND increasing the size
## surf3D> # (by reducing the x- y and z- ranges
## surf3D>  surf3D(x, y, z, colvar = y, colkey = FALSE, box = FALSE, 
## surf3D+         theta = 60, border = "black", xlim = range(x)*0.8, 
## surf3D+         ylim = range(y)*0.8, zlim = range(z)*0.8)
## 
## surf3D> # Now with one color and shading
## surf3D>  surf3D(x, y, z, box = FALSE,
## surf3D+         theta = 60, col = "lightblue", shade = 0.9)

## 
## surf3D> ## Not run: 
## surf3D> ##D  # rotation
## surf3D> ##D   for (angle in seq(0, 360, by = 10))
## surf3D> ##D     plotdev(theta = angle)
## surf3D> ##D 
## surf3D> ## End(Not run)
## surf3D> 
## surf3D> ## =======================================================================
## surf3D> ## Several other shapes 
## surf3D> ## http://xahlee.info/surface/gallery.html
## surf3D> ## =======================================================================
## surf3D> 
## surf3D>  par(mfrow = c(2, 2)) 
## 
## surf3D>  # Shape 1
## surf3D>  M  <- mesh(seq(0,  6*pi, length.out = 50), 
## surf3D+             seq(pi/3, pi, length.out = 50))
## 
## surf3D>  u  <- M$x ; v <- M$y
## 
## surf3D>  x <- u/2 * sin(v) * cos(u)
## 
## surf3D>  y <- u/2 * sin(v) * sin(u)
## 
## surf3D>  z <- u/2 * cos(v)
## 
## surf3D>  surf3D(x, y, z, colvar = z, colkey = FALSE, box = FALSE, phi = 50)
## 
## surf3D> # Shape 2: add border
## surf3D>  M  <- mesh(seq(0, 2*pi, length.out = 50), 
## surf3D+             seq(0, 2*pi, length.out = 50))
## 
## surf3D>  u  <- M$x ; v  <- M$y
## 
## surf3D>  x  <- sin(u)
## 
## surf3D>  y  <- sin(v)
## 
## surf3D>  z  <- sin(u + v)
## 
## surf3D>  surf3D(x, y, z, colvar = z, border = "black", 
## surf3D+         colkey = FALSE)
## 
## surf3D> # shape 3: uses same mesh, other perspective (d >1)
## surf3D>  x <- (3 + cos(v/2)*sin(u) - sin(v/2)*sin(2*u))*cos(v)
## 
## surf3D>  y <- (3 + cos(v/2)*sin(u) - sin(v/2)*sin(2*u))*sin(v)
## 
## surf3D>  z <- sin(v/2)*sin(u) + cos(v/2)*sin(2*u)
## 
## surf3D>  surf3D(x, y, z, colvar = z, colkey = FALSE, d = 2, facets = FALSE)
## 
## surf3D> # shape 4: more complex colvar
## surf3D>  M  <- mesh(seq(-13.2, 13.2, length.out = 50), 
## surf3D+             seq(-37.4, 37.4, length.out = 50))
## 
## surf3D>  u  <- M$x   ; v <- M$y
## 
## surf3D>  b <- 0.4; r <- 1 - b^2; w <- sqrt(r)
## 
## surf3D>  D <- b*((w*cosh(b*u))^2 + (b*sin(w*v))^2)
## 
## surf3D>  x <- -u + (2*r*cosh(b*u)*sinh(b*u)) / D
## 
## surf3D>  y <- (2*w*cosh(b*u)*(-(w*cos(v)*cos(w*v)) - sin(v)*sin(w*v))) / D
## 
## surf3D>  z <- (2*w*cosh(b*u)*(-(w*sin(v)*cos(w*v)) + cos(v)*sin(w*v))) / D
## 
## surf3D>  surf3D(x, y, z, colvar = sqrt(x + 8.3), colkey = FALSE, 
## surf3D+         theta = 10, border = "black", box = FALSE)

## 
## surf3D>  box()
## 
## surf3D> ## =======================================================================
## surf3D> ## A sphere, with box type with grid lines
## surf3D> ## =======================================================================
## surf3D> 
## surf3D>  par(mar = c(2, 2, 2, 2))
## 
## surf3D>  par(mfrow = c(1, 1))
## 
## surf3D>  M  <- mesh(seq(0, 2*pi, length.out = 50), 
## surf3D+             seq(0,   pi, length.out = 50))
## 
## surf3D>  u  <- M$x ; v  <- M$y
## 
## surf3D>  x <- cos(u)*sin(v)
## 
## surf3D>  y <- sin(u)*sin(v)
## 
## surf3D>  z <- cos(v)
## 
## surf3D>  colvar <- sin(u*6) * sin(v*6)
## 
## surf3D>  surf3D(y, x, z, colvar = colvar, phi = 0, bty = "b2", 
## surf3D+         lighting = TRUE, ltheta = 40)

## 
## surf3D> ## =======================================================================
## surf3D> ## Function spheresurf3D
## surf3D> ## =======================================================================
## surf3D> 
## surf3D>  par(mfrow = c(2, 2))
## 
## surf3D>  spheresurf3D()
## 
## surf3D> # true ranges are [-1, 1]; set limits to [-0.8, 0.8] to make larger plots
## surf3D>  lim <- c(-0.8, 0.8)
## 
## surf3D>  spheresurf3D(colkey = FALSE, xlim = lim, ylim = lim, zlim = lim)
## 
## surf3D>  spheresurf3D(bty = "b", ticktype = "detailed", phi = 50)
## 
## surf3D>  spheresurf3D(colvar = matrix(nrow = 30, data = runif(900)))

## 
## surf3D> ## =======================================================================
## surf3D> ## Images on a sphere
## surf3D> ## =======================================================================
## surf3D> 
## surf3D>  par(mfrow = c(1, 1), mar = c(1, 1, 1, 3))
## 
## surf3D>  AA <- Hypsometry$z; AA[AA<=0] <- NA
## 
## surf3D>  lim <- c(-0.8, 0.8)
## 
## surf3D> # log transformation of color variable
## surf3D>  spheresurf3D(AA, NAcol = "black", theta = 90, phi = 30, box = FALSE,
## surf3D+    xlim = lim, ylim = lim, zlim = lim, log = "c")

## 
## surf3D> # restore plotting parameters
## surf3D>  par(mfrow = pm)
## 
## surf3D>  par(mar = pmar)
example(slice3D)
## 
## slic3D> # save plotting parameters
## slic3D>  pm <- par("mfrow")
## 
## slic3D>  pmar <- par("mar")
## 
## slic3D> ## =======================================================================
## slic3D> ## Simple slice3D examples
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  par(mfrow = c(2, 2))
## 
## slic3D>  x <- y <- z <- seq(-1, 1, by = 0.1)
## 
## slic3D>  grid   <- mesh(x, y, z)
## 
## slic3D>  colvar <- with(grid, x*exp(-x^2 - y^2 - z^2))
## 
## slic3D> # default is just the panels
## slic3D>  slice3D  (x, y, z, colvar = colvar, theta = 60)
## 
## slic3D> # contour slices
## slic3D>  slicecont3D (x, y, z, ys = seq(-1, 1, by = 0.5), colvar = colvar, 
## slic3D+            theta = 60, border = "black")
## 
## slic3D>  slice3D  (x, y, z, xs = c(-1, -0.5, 0.5), ys = c(-1, 0, 1), 
## slic3D+            zs = c(-1, 0), colvar = colvar, 
## slic3D+            theta = 60, phi = 40)
## 
## slic3D> ## =======================================================================
## slic3D> ## coloring on a surface
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  XY <- mesh(x, y)
## 
## slic3D>  ZZ <- XY$x*XY$y
## 
## slic3D>  slice3D  (x, y, z, xs = XY$x, ys = XY$y, zs = ZZ, colvar = colvar, 
## slic3D+            lighting =  TRUE, lphi = 90, ltheta = 0)

## 
## slic3D> ## =======================================================================
## slic3D> ## Specifying transparent colors
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  par(mfrow = c(1, 1))
## 
## slic3D>  x <- y <- z <- seq(-4, 4, by = 0.2)
## 
## slic3D>  M <- mesh(x, y, z)
## 
## slic3D>  R <- with (M, sqrt(x^2 + y^2 + z^2))
## 
## slic3D>  p <- sin(2*R) /(R+1e-3)
## 
## slic3D> ## Not run: 
## slic3D> ##D # This is very slow - alpha = 0.5 makes it transparent
## slic3D> ##D 
## slic3D> ##D  slice3D(x, y, z, colvar = p, col = jet.col(alpha = 0.5), 
## slic3D> ##D          xs = 0, ys = c(-4, 0, 4), zs = NULL, d = 2) 
## slic3D> ## End(Not run)
## slic3D> 
## slic3D>  slice3D(x, y, z, colvar = p, d = 2, theta = 60, border = "black",
## slic3D+          xs = c(-4, 0), ys = c(-4, 0, 4), zs = c(-4, 0))

## 
## slic3D> ## =======================================================================
## slic3D> ## A section along a transect
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  data(Oxsat)
## 
## slic3D>  Ox <- Oxsat$val[,  Oxsat$lat > - 5 & Oxsat$lat < 5, ]
## 
## slic3D>  slice3D(x = Oxsat$lon, z = -Oxsat$depth, y = 1:5, colvar = Ox, 
## slic3D+          ys = 1:5, zs = NULL, NAcol = "black", 
## slic3D+          expand = 0.4, theta = 45, phi = 45)

## 
## slic3D> ## =======================================================================
## slic3D> ## isosurf3D example - rather slow
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  par(mfrow = c(2, 2), mar  = c(2, 2, 2, 2))
## 
## slic3D>  x <- y <- z <- seq(-2, 2, length.out = 15)
## 
## slic3D>  xyz <- mesh(x, y, z)
## 
## slic3D>  F <- with(xyz, log(x^2 + y^2 + z^2 + 
## slic3D+                 10*(x^2 + y^2) * (y^2 + z^2) ^2))
## 
## slic3D> # use shading for level = 1 - show triangulation with border
## slic3D>  isosurf3D(x, y, z, F, level = 1, shade = 0.9, 
## slic3D+            col = "yellow", border = "orange")
## 
## slic3D> # lighting for level - 2
## slic3D>  isosurf3D(x, y, z, F, level = 2, lighting = TRUE,
## slic3D+            lphi = 0, ltheta = 0, col = "blue", shade = NA)
## 
## slic3D> # three levels, transparency added
## slic3D>  isosurf3D(x, y, z, F, level = seq(0, 4, by = 2), 
## slic3D+    col = c("red", "blue", "yellow"), 
## slic3D+    clab = "F", alpha = 0.2, theta = 0, lighting = TRUE)
## 
## slic3D> # transparency can also be added afterwards with plotdev()
## slic3D> ## Not run: 
## slic3D> ##D  isosurf3D(x, y, z, F, level = seq(0, 4, by = 2), 
## slic3D> ##D    col = c("red", "blue", "yellow"), 
## slic3D> ##D    shade = NA, plot = FALSE, clab = "F")  
## slic3D> ##D  plotdev(lighting = TRUE, alpha = 0.2, theta = 0)
## slic3D> ## End(Not run)
## slic3D> # use of creatisosurf
## slic3D>  iso <- createisosurf(x, y, z, F, level = 2)
## 
## slic3D>  head(iso)
##               x          y         z
## [1,]  0.0000000 -0.1179802 -2.000000
## [2,] -0.1204879  0.0000000 -2.000000
## [3,]  0.0000000 -0.2073773 -1.714286
## [4,]  0.0000000 -0.2073773 -1.714286
## [5,] -0.1204879  0.0000000 -2.000000
## [6,] -0.2138894  0.0000000 -1.714286
## 
## slic3D>  triangle3D(iso, col = "green", shade = 0.3)

## 
## slic3D> ## Not run: 
## slic3D> ##D  # higher resolution
## slic3D> ##D   x <- y <- z <- seq(-2, 2, length.out = 50)
## slic3D> ##D   xyz <- mesh(x, y, z)
## slic3D> ##D   F <- with(xyz, log(x^2 + y^2 + z^2 + 
## slic3D> ##D                 10*(x^2 + y^2) * (y^2 + z^2) ^2))
## slic3D> ##D 
## slic3D> ##D # three levels
## slic3D> ##D   isosurf3D(x, y, z, F, level = seq(0, 4, by = 2), 
## slic3D> ##D     col = c("red", "blue", "yellow"), 
## slic3D> ##D     shade = NA, plot = FALSE, clab = "F")  
## slic3D> ##D   plotdev(lighting = TRUE, alpha = 0.2, theta = 0)
## slic3D> ## End(Not run)
## slic3D> 
## slic3D> ## =======================================================================
## slic3D> ## voxel3D example
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  par(mfrow = c(2, 2), mar  = c(2, 2, 2, 2))
## 
## slic3D> # fast but needs high resolution grid
## slic3D>  x <- y <- z <- seq(-2, 2, length.out = 70)
## 
## slic3D>  xyz <- mesh(x, y, z)
## 
## slic3D>  F <- with(xyz, log(x^2 + y^2 + z^2 + 
## slic3D+                 10*(x^2 + y^2) * (y^2 + z^2) ^2))
## 
## slic3D>  voxel3D(x, y, z, F, level = 4, pch = ".", cex = 5)
## 
## slic3D> ## =======================================================================
## slic3D> ## rotation 
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  plotdev(theta = 45, phi = 0)
## 
## slic3D>  plotdev(theta = 90, phi = 10)
## 
## slic3D> # same using createvoxel -  more flexible for coloring
## slic3D>  vox <- createvoxel(x, y, z, F, level = 4)
## 
## slic3D>  scatter3D(vox$x, vox$y, vox$z, colvar = vox$y, 
## slic3D+    bty = "g", colkey = FALSE)

## 
## slic3D> ## =======================================================================
## slic3D> ## voxel3D to show hypox sites
## slic3D> ## =======================================================================
## slic3D> 
## slic3D>  par(mfrow = c(1, 1), mar = c(2, 2, 2, 2))
## 
## slic3D>  Hypox <- createvoxel(Oxsat$lon, Oxsat$lat, Oxsat$depth[1:19], 
## slic3D+                       Oxsat$val[,,1:19], level = 40, operator = "<")
## 
## slic3D>  panel <- function(pmat) {  # an image at the bottom
## slic3D+    Nx <- length(Oxsat$lon)
## slic3D+    Ny <- length(Oxsat$lat)
## slic3D+    M <- mesh(Oxsat$lon, Oxsat$lat) 
## slic3D+    xy <- trans3D(pmat = pmat, x = as.vector(M$x), y = as.vector(M$y), 
## slic3D+         z = rep(-1000, length.out = Nx*Ny)) 
## slic3D+    x <- matrix(nrow = Nx, ncol = Ny, data = xy$x)
## slic3D+    y <- matrix(nrow = Nx, ncol = Ny, data = xy$y)
## slic3D+    Bat <- Oxsat$val[,,1]; Bat[!is.na(Bat)] <- 1
## slic3D+    image2D(x = x, y = y, z = Bat, NAcol = "black", col = "grey",
## slic3D+          add = TRUE, colkey = FALSE)
## slic3D+  }
## 
## slic3D>  scatter3D(Hypox$x, Hypox$y, -Hypox$z, colvar = Hypox$cv, 
## slic3D+            panel.first = panel, pch = ".", bty = "b", 
## slic3D+            theta = 30, phi = 20, ticktype = "detailed",
## slic3D+            zlim = c(-1000,0), xlim = range(Oxsat$lon), 
## slic3D+            ylim = range(Oxsat$lat) )

## 
## slic3D> # restore plotting parameters
## slic3D>  par(mfrow = pm)
## 
## slic3D>  par(mar = pmar)
example(scatter3D)
## 
## sctt3D> # save plotting parameters
## sctt3D>  pm <- par("mfrow")
## 
## sctt3D> ## =======================================================================
## sctt3D> ## A sphere 
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(1, 1))
## 
## sctt3D>  M  <- mesh(seq(0, 2*pi, length.out = 100), 
## sctt3D+             seq(0,   pi, length.out = 100))
## 
## sctt3D>  u  <- M$x ; v  <- M$y
## 
## sctt3D>  x <- cos(u)*sin(v)
## 
## sctt3D>  y <- sin(u)*sin(v)
## 
## sctt3D>  z <- cos(v)
## 
## sctt3D> # full  panels of box are drawn (bty = "f")
## sctt3D>  scatter3D(x, y, z, pch = ".", col = "red", 
## sctt3D+            bty = "f", cex = 2, colkey = FALSE)

## 
## sctt3D> ## =======================================================================
## sctt3D> ## Different types
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par (mfrow = c(2, 2))
## 
## sctt3D>  z <- seq(0, 10, 0.2)
## 
## sctt3D>  x <- cos(z)
## 
## sctt3D>  y <- sin(z)*z
## 
## sctt3D> # greyish background for the boxtype (bty = "g") 
## sctt3D>  scatter3D(x, y, z, phi = 0, bty = "g",
## sctt3D+            pch = 20, cex = 2, ticktype = "detailed")
## 
## sctt3D> # add another point
## sctt3D>  scatter3D(x = 0, y = 0, z = 0, add = TRUE, colkey = FALSE, 
## sctt3D+            pch = 18, cex = 3, col = "black")
## 
## sctt3D> # add text
## sctt3D>  text3D(x = cos(1:10), y = (sin(1:10)*(1:10) - 1), 
## sctt3D+         z = 1:10, colkey = FALSE, add = TRUE, 
## sctt3D+         labels = LETTERS[1:10], col = c("black", "red"))
## 
## sctt3D> # line plot
## sctt3D>  scatter3D(x, y, z, phi = 0, bty = "g", type = "l", 
## sctt3D+            ticktype = "detailed", lwd = 4)
## 
## sctt3D> # points and lines
## sctt3D>  scatter3D(x, y, z, phi = 0, bty = "g", type = "b", 
## sctt3D+            ticktype = "detailed", pch = 20, 
## sctt3D+            cex = c(0.5, 1, 1.5))
## 
## sctt3D> # vertical lines
## sctt3D>  scatter3D(x, y, z, phi = 0, bty = "g",  type = "h", 
## sctt3D+            ticktype = "detailed")

## 
## sctt3D> ## =======================================================================
## sctt3D> ## With confidence interval
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  x <- runif(20)
## 
## sctt3D>  y <- runif(20)
## 
## sctt3D>  z <- runif(20)
## 
## sctt3D>  par(mfrow = c(1, 1))
## 
## sctt3D>  CI <- list(z = matrix(nrow = length(x),
## sctt3D+                        data = rep(0.05, 2*length(x))))
## 
## sctt3D> # greyish background for the boxtype (bty = "g")
## sctt3D>  scatter3D(x, y, z, phi = 0, bty = "g", CI = CI,
## sctt3D+    col = gg.col(100), pch = 18, cex = 2, ticktype = "detailed",
## sctt3D+    xlim = c(0, 1), ylim = c(0, 1), zlim = c(0, 1))
## 
## sctt3D> # add new set of points
## sctt3D>  x <- runif(20)
## 
## sctt3D>  y <- runif(20)
## 
## sctt3D>  z <- runif(20)
## 
## sctt3D>  CI2 <- list(x = matrix(nrow = length(x),
## sctt3D+                        data = rep(0.05, 2*length(x))),
## sctt3D+              z = matrix(nrow = length(x),
## sctt3D+                        data = rep(0.05, 2*length(x))))
## 
## sctt3D>  scatter3D(x, y, z, CI = CI2, add = TRUE, col = "red", pch = 16)

## 
## sctt3D> ## =======================================================================
## sctt3D> ## With a surface
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(1, 1))
## 
## sctt3D> # surface = volcano
## sctt3D>  M <- mesh(1:nrow(volcano), 1:ncol(volcano))
## 
## sctt3D> # 100 points above volcano 
## sctt3D>  N  <- 100
## 
## sctt3D>  xs <- runif(N) * 87
## 
## sctt3D>  ys <- runif(N) * 61
## 
## sctt3D>  zs <- runif(N)*50 + 154
## 
## sctt3D> # scatter + surface
## sctt3D>  scatter3D(xs, ys, zs, ticktype = "detailed", pch = 16, 
## sctt3D+    bty = "f", xlim = c(1, 87), ylim = c(1,61), zlim = c(94, 215), 
## sctt3D+    surf = list(x = M$x, y = M$y, z = volcano,  
## sctt3D+                NAcol = "grey", shade = 0.1))

## 
## sctt3D> ## =======================================================================
## sctt3D> ## A surface and CI
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(1, 1))
## 
## sctt3D>  M <- mesh(seq(0, 2*pi, length = 30), (1:30)/100)
## 
## sctt3D>  z <- with (M, sin(x) + y)
## 
## sctt3D> # points 'sampled'
## sctt3D>  N <- 30
## 
## sctt3D>  xs <- runif(N) * 2*pi
## 
## sctt3D>  ys <- runif(N) * 0.3
## 
## sctt3D>  zs <- sin(xs) + ys + rnorm(N)*0.3
## 
## sctt3D>  CI <- list(z = matrix(nrow = length(xs), 
## sctt3D+                        data = rep(0.3, 2*length(xs))),
## sctt3D+             lwd = 3)
## 
## sctt3D> # facets = NA makes a transparent surface; borders are black
## sctt3D>  scatter3D(xs, ys, zs, ticktype = "detailed", pch = 16, 
## sctt3D+    xlim = c(0, 2*pi), ylim = c(0, 0.3), zlim = c(-1.5, 1.5), 
## sctt3D+    CI = CI, theta = 20, phi = 30, cex = 2,
## sctt3D+    surf = list(x = M$x, y = M$y, z = z, border = "black", facets = NA)
## sctt3D+    )

## 
## sctt3D> ## =======================================================================
## sctt3D> ## droplines till the fitted surface
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  with (mtcars, {
## sctt3D+ 
## sctt3D+   # linear regression
## sctt3D+    fit <- lm(mpg ~ wt + disp)
## sctt3D+ 
## sctt3D+   # predict values on regular xy grid
## sctt3D+    wt.pred <- seq(1.5, 5.5, length.out = 30)
## sctt3D+    disp.pred <- seq(71, 472, length.out = 30)
## sctt3D+    xy <- expand.grid(wt = wt.pred, 
## sctt3D+                      disp = disp.pred)
## sctt3D+ 
## sctt3D+    mpg.pred <- matrix (nrow = 30, ncol = 30, 
## sctt3D+       data = predict(fit, newdata = data.frame(xy), 
## sctt3D+       interval = "prediction"))
## sctt3D+ 
## sctt3D+ # fitted points for droplines to surface
## sctt3D+    fitpoints <- predict(fit) 
## sctt3D+ 
## sctt3D+    scatter3D(z = mpg, x = wt, y = disp, pch = 18, cex = 2, 
## sctt3D+       theta = 20, phi = 20, ticktype = "detailed",
## sctt3D+       xlab = "wt", ylab = "disp", zlab = "mpg",  
## sctt3D+       surf = list(x = wt.pred, y = disp.pred, z = mpg.pred,  
## sctt3D+                   facets = NA, fit = fitpoints),
## sctt3D+       main = "mtcars")
## sctt3D+   
## sctt3D+  })

## 
## sctt3D> ## =======================================================================
## sctt3D> ## Two ways to make a scatter 3D of quakes data set
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(1, 1)) 
## 
## sctt3D> # first way, use vertical spikes (type = "h")
## sctt3D>  with(quakes, scatter3D(x = long, y = lat, z = -depth, colvar = mag, 
## sctt3D+       pch = 16, cex = 1.5, xlab = "longitude", ylab = "latitude", 
## sctt3D+       zlab = "depth, km", clab = c("Richter","Magnitude"),
## sctt3D+       main = "Earthquakes off Fiji", ticktype = "detailed", 
## sctt3D+       type = "h", theta = 10, d = 2, 
## sctt3D+       colkey = list(length = 0.5, width = 0.5, cex.clab = 0.75))
## sctt3D+       )

## 
## sctt3D> # second way: add dots on bottom and left panel
## sctt3D> # before the scatters are drawn, 
## sctt3D> # add small dots on basal plane and on the depth plane
## sctt3D>  panelfirst <- function(pmat) {
## sctt3D+     zmin <- min(-quakes$depth)
## sctt3D+     XY <- trans3D(quakes$long, quakes$lat, 
## sctt3D+                   z = rep(zmin, nrow(quakes)), pmat = pmat)
## sctt3D+     scatter2D(XY$x, XY$y, colvar = quakes$mag, pch = ".", 
## sctt3D+             cex = 2, add = TRUE, colkey = FALSE)
## sctt3D+  
## sctt3D+     xmin <- min(quakes$long)
## sctt3D+     XY <- trans3D(x = rep(xmin, nrow(quakes)), y = quakes$lat, 
## sctt3D+                   z = -quakes$depth, pmat = pmat)
## sctt3D+     scatter2D(XY$x, XY$y, colvar = quakes$mag, pch = ".", 
## sctt3D+             cex = 2, add = TRUE, colkey = FALSE)
## sctt3D+  }
## 
## sctt3D>  with(quakes, scatter3D(x = long, y = lat, z = -depth, colvar = mag, 
## sctt3D+       pch = 16, cex = 1.5, xlab = "longitude", ylab = "latitude", 
## sctt3D+       zlab = "depth, km", clab = c("Richter","Magnitude"),
## sctt3D+       main = "Earthquakes off Fiji", ticktype = "detailed", 
## sctt3D+       panel.first = panelfirst, theta = 10, d = 2, 
## sctt3D+       colkey = list(length = 0.5, width = 0.5, cex.clab = 0.75))
## sctt3D+       )

## 
## sctt3D> ## =======================================================================
## sctt3D> ## text3D and scatter3D
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  with(USArrests, text3D(Murder, Assault, Rape, 
## sctt3D+     colvar = UrbanPop, col = gg.col(100), theta = 60, phi = 20,
## sctt3D+     xlab = "Murder", ylab = "Assault", zlab = "Rape", 
## sctt3D+     main = "USA arrests", 
## sctt3D+     labels = rownames(USArrests), cex = 0.6, 
## sctt3D+     bty = "g", ticktype = "detailed", d = 2,
## sctt3D+     clab = c("Urban","Pop"), adj = 0.5, font = 2))
## 
## sctt3D>  with(USArrests, scatter3D(Murder, Assault, Rape - 1, 
## sctt3D+     colvar = UrbanPop, col = gg.col(100), 
## sctt3D+     type = "h", pch = ".", add = TRUE))

## 
## sctt3D> ## =======================================================================
## sctt3D> ## zoom near origin
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D> # display axis ranges
## sctt3D>  getplist()[c("xlim","ylim","zlim")] 
## $xlim
## [1]  0.8 17.4
## 
## $ylim
## [1]  45 337
## 
## $zlim
## [1]  7.3 46.0
## 
## 
## sctt3D> # choose suitable ranges
## sctt3D>  plotdev(xlim = c(0, 10), ylim = c(40, 150), 
## sctt3D+          zlim = c(7, 25))

## 
## sctt3D> ## =======================================================================
## sctt3D> ## text3D to label x- and y axis
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(1, 1))
## 
## sctt3D>  hist3D (x = 1:5, y = 1:4, z = VADeaths,
## sctt3D+         bty = "g", phi = 20,  theta = -60,
## sctt3D+         xlab = "", ylab = "", zlab = "", main = "VADeaths",
## sctt3D+         col = "#0072B2", border = "black", shade = 0.8,
## sctt3D+         ticktype = "detailed", space = 0.15, d = 2, cex.axis = 1e-9)

## 
## sctt3D>  text3D(x = 1:5, y = rep(0.5, 5), z = rep(3, 5),
## sctt3D+        labels = rownames(VADeaths),
## sctt3D+        add = TRUE, adj = 0)
## 
## sctt3D>  text3D(x = rep(1, 4),   y = 1:4, z = rep(0, 4),
## sctt3D+        labels  = colnames(VADeaths),
## sctt3D+        add = TRUE, adj = 1)
## 
## sctt3D> ## =======================================================================
## sctt3D> ## Scatter2D; bty can also be set = to one of the perspbox alernatives
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(2, 2))
## 
## sctt3D>  x <- seq(0, 2*pi, length.out = 30)
## 
## sctt3D>  scatter2D(x, sin(x), colvar = cos(x), pch = 16, 
## sctt3D+          ylab = "sin", clab = "cos", cex = 1.5)
## 
## sctt3D> # other box types:
## sctt3D>  scatter2D(x, sin(x), colvar = cos(x), type = "l", lwd = 4, bty = "g")
## 
## sctt3D>  scatter2D(x, sin(x), colvar = cos(x), type = "b", lwd = 2, bty = "b2")
## 
## sctt3D> # transparent colors and spikes
## sctt3D>  scatter2D(x, sin(x), colvar = cos(x), type = "h", lwd = 4, alpha = 0.5)

## 
## sctt3D> ## =======================================================================
## sctt3D> ## mesh examples and scatter2D
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(1, 2))
## 
## sctt3D>  x <- seq(-1, 1, by = 0.1)
## 
## sctt3D>  y <- seq(-2, 2, by = 0.2)
## 
## sctt3D>  grid <- mesh(x, y)
## 
## sctt3D>  z    <- with(grid, cos(x) * sin(y))
## 
## sctt3D>  image2D(z, x = x, y = y)
## 
## sctt3D>  points(grid)
## 
## sctt3D>  scatter2D(grid$x, grid$y, colvar = z, pch = 20, cex = 2)

## 
## sctt3D> ## =======================================================================
## sctt3D> ## scatter plot with confidence intervals
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(2, 2))
## 
## sctt3D>  x  <- sort(rnorm(10)) 
## 
## sctt3D>  y  <- runif(10)
## 
## sctt3D>  cv <- sqrt(x^2 + y^2)
## 
## sctt3D>  CI <- list(lwd = 2)
## 
## sctt3D>  CI$x <- matrix (nrow = length(x), data = c(rep(0.25, 2*length(x))))
## 
## sctt3D>  scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI)
## 
## sctt3D>  scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI, type = "b")
## 
## sctt3D>  CI$y <- matrix (nrow = length(x), data = c(rep(0.05, 2*length(x))))
## 
## sctt3D>  CI$col <- "black"
## 
## sctt3D>  scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI)
## 
## sctt3D>  CI$y[c(2,4,8,10), ] <- NA  # Some points have no CI
## 
## sctt3D>  CI$x[c(2,4,8,10), ] <- NA  # Some points have no CI
## 
## sctt3D>  CI$alen <- 0.02            # increase arrow head
## 
## sctt3D>  scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI)

## 
## sctt3D> ## =======================================================================
## sctt3D> ## Scatter on an image
## sctt3D> ## =======================================================================
## sctt3D>  
## sctt3D>  par(mfrow = c(1, 1))
## 
## sctt3D> # image of oxygen saturation
## sctt3D>  oxlim <- range(Oxsat$val[,,1], na.rm  = TRUE) 
## 
## sctt3D>  image2D(z = Oxsat$val[,,1], x = Oxsat$lon, y = Oxsat$lat,
## sctt3D+        contour = TRUE, 
## sctt3D+        xlab = "longitude", ylab = "latitude", 
## sctt3D+        main = "Oxygen saturation", zlim = oxlim, clab = "%")

## 
## sctt3D> # (imaginary) measurements at 5 sites
## sctt3D>  lon   <- c( 11.2,   6.0, 0.9,  -4, -8.8)
## 
## sctt3D>  lat   <- c(-19.7,-14.45,-9.1,-3.8, -1.5)
## 
## sctt3D>  O2sat <- c(   90,    95,  92,  85,  100)
## 
## sctt3D> # add to image; use same zrange; avoid adding  a color key
## sctt3D>  scatter2D(colvar = O2sat, x = lon, y = lat, clim = oxlim, pch = 16,
## sctt3D+          add = TRUE, cex = 2, colkey = FALSE)
## 
## sctt3D> ## =======================================================================
## sctt3D> ## Scatter on a contourplot
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  par(mfrow = c(1, 1))
## 
## sctt3D> # room for colorkey by setting colkey = list(plot = FALSE)
## sctt3D> 
## sctt3D> # contour plot of the ocean's bathymetry
## sctt3D>  Depth <- Hypsometry$z
## 
## sctt3D>  Depth[Depth > 0] <- NA
## 
## sctt3D>  contour2D(z = Depth, x = Hypsometry$x, y = Hypsometry$y, 
## sctt3D+        xlab = "longitude", ylab = "latitude", 
## sctt3D+        col = "black", NAcol = "grey", levels = seq(-6000, 0, by = 2000),
## sctt3D+        main = "Oxygen saturation along ship track", 
## sctt3D+        colkey = list(plot = FALSE))
## 
## sctt3D> # add data to image; with  a color key
## sctt3D>  scatter2D(colvar = O2sat, x = lon, y = lat, pch = 16,
## sctt3D+          add = TRUE, cex = 2, clab = "%")

## 
## sctt3D> ## =======================================================================
## sctt3D> ## scatter2D for time-series plots
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D> # Plotting sunspot 'anomalies'
## sctt3D> sunspot <- data.frame(year = time(sunspot.month), 
## sctt3D+   anom = sunspot.month - mean(sunspot.month))
## 
## sctt3D> # long-term moving average of anomaly
## sctt3D> ff <- 100
## 
## sctt3D> sunspot$ma <- filter(sunspot$anom, rep(1/ff, ff), sides = 2)
## 
## sctt3D> with (sunspot, lines2D(year, anom, 
## sctt3D+   colvar = anom > 0, 
## sctt3D+   col = c("pink", "lightblue"),
## sctt3D+   main = "sunspot anomaly", type = "h", 
## sctt3D+   colkey = FALSE, las = 1, xlab = "year", ylab = ""))

## 
## sctt3D> lines2D(sunspot$year, sunspot$ma, add = TRUE)  
## 
## sctt3D> # The same
## sctt3D> #with (sunspot, plot(year, anom, 
## sctt3D> #  col = c("pink", "lightblue")[(anom > 0) + 1],
## sctt3D> #  main = "sunspot", type = "h", las = 1))
## sctt3D> 
## sctt3D> # but this does not work due to NAs...  
## sctt3D> # lines(sunspot$year, sunspot$ma)  
## sctt3D> 
## sctt3D> ## =======================================================================
## sctt3D> ## text2D
## sctt3D> ## =======================================================================
## sctt3D> 
## sctt3D>  with(USArrests, text2D(x = Murder, y = Assault + 5, colvar = Rape, 
## sctt3D+      xlab = "Murder", ylab = "Assault", clab = "Rape", 
## sctt3D+      main = "USA arrests", labels = rownames(USArrests), cex = 0.6, 
## sctt3D+      adj = 0.5, font = 2))

## 
## sctt3D>  with(USArrests, scatter2D(x = Murder, y = Assault, colvar = Rape, 
## sctt3D+      pch = 16, add = TRUE, colkey = FALSE))
## 
## sctt3D> # reset plotting parameters
## sctt3D>  par(mfrow = pm)
example(segments3D)
## 
## sgmn3D> # save plotting parameters
## sgmn3D>   pm <- par("mfrow")
## 
## sgmn3D> ## ========================================================================
## sgmn3D> ## arrows, points, segments, box
## sgmn3D> ## ========================================================================
## sgmn3D> 
## sgmn3D> # Create a grid of x, y, and z values
## sgmn3D>  xx <- yy <- seq(-0.8, 0.8, by = 0.2)
## 
## sgmn3D>  zz <- seq(-0.8, 0.8, by = 0.8)
## 
## sgmn3D>  M <- mesh(xx, yy, zz)
## 
## sgmn3D>  x0 <- M$x; y0 <- M$y; z0 <- M$z
## 
## sgmn3D>  x1 <- x0 + 0.1
## 
## sgmn3D>  Col <- c("red", "blue", "green") 
## 
## sgmn3D>  arrows3D(x0, y0, z0, x1 = x1, colvar = z0, lwd = 2, 
## sgmn3D+           d = 2, clab = "z-value", col = Col, length = 0.1,
## sgmn3D+           xlim = c(-0.8, 0.8), ylim = c(-0.8, 0.8),
## sgmn3D+           main = "arrows3D, points3D, segments3D, border3D")
## 
## sgmn3D> # add starting point of arrows
## sgmn3D>  points3D(x0, y0, z0, add = TRUE, colvar = z0, 
## sgmn3D+            colkey = FALSE, pch = ".", cex = 3, col = Col)
## 
## sgmn3D> # use segments to add section
## sgmn3D>  x0 <- c(-0.8, 0.8,  0.8, -0.8)
## 
## sgmn3D>  x1 <- c( 0.8, 0.8, -0.8, -0.8)
## 
## sgmn3D>  y0 <- c(-0.8, -0.8, 0.8, -0.8)
## 
## sgmn3D>  y1 <- c(-0.8,  0.8, 0.8, 0.8)
## 
## sgmn3D>  z0 <- c(0., 0., 0., 0.)
## 
## sgmn3D>  segments3D(x0, y0, z0, x1, y1, z1 = z0,
## sgmn3D+      add = TRUE, col = "black", lwd = 2)
## 
## sgmn3D> # add a box 
## sgmn3D>  border3D(-0.8, -0.8, -0.8, 0.8, 0.8, 0.8,
## sgmn3D+        col = "orange", add = TRUE, lwd = 3)

## 
## sgmn3D> ## ========================================================================
## sgmn3D> ## boxes, cubes
## sgmn3D> ## ========================================================================
## sgmn3D> 
## sgmn3D> # borders are boxes without facets  
## sgmn3D>  border3D(x0 = seq(-0.8, -0.1, by = 0.1), 
## sgmn3D+        y0 = seq(-0.8, -0.1, by = 0.1),
## sgmn3D+        z0 = seq(-0.8, -0.1, by = 0.1),
## sgmn3D+        x1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+        y1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+        z1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+        col = gg.col(8), lty = 2, 
## sgmn3D+        lwd = c(1, 4), phi = 20, main = "border3D")

## 
## sgmn3D>  box3D(x0 = -0.8, y0 = -0.8, z0 = -0.8, 
## sgmn3D+        x1 = 0.8, y1 = 0.8, z1 = 0.8, 
## sgmn3D+        border = "black", lwd = 2, 
## sgmn3D+        col = gg.col(1, alpha = 0.8), 
## sgmn3D+        main = "box3D")

## 
## sgmn3D>  box3D(x0 = seq(-0.8, -0.1, by = 0.1), 
## sgmn3D+        y0 = seq(-0.8, -0.1, by = 0.1),
## sgmn3D+        z0 = seq(-0.8, -0.1, by = 0.1),
## sgmn3D+        x1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+        y1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+        z1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+        col = rainbow(n = 8, alpha = 0.1), 
## sgmn3D+        border = "black", lwd = 2, phi = 20)

## 
## sgmn3D> # here the perspective does not always work 
## sgmn3D> # use alpha.col to set the transparency of a vector of colors
## sgmn3D>  box3D(x0 = runif(3), y0 = runif(3), z0 = runif(3),
## sgmn3D+        x1 = runif(3), y1 = runif(3), z1 = runif(3),
## sgmn3D+        col = c("red", "lightblue", "orange"), alpha = 0.5,
## sgmn3D+        border = "black", lwd = 2)

## 
## sgmn3D> ## ========================================================================
## sgmn3D> ## rectangles
## sgmn3D> ## ========================================================================
## sgmn3D> # at constant 'z'
## sgmn3D>  rect3D(x0 = seq(-0.8, -0.1, by = 0.1), 
## sgmn3D+         y0 = seq(-0.8, -0.1, by = 0.1),
## sgmn3D+         z0 = seq(-0.8, -0.1, by = 0.1),
## sgmn3D+         x1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+         y1 = seq(0.8, 0.1, by = -0.1),
## sgmn3D+         col = gg.col(8), border = "black",
## sgmn3D+         bty = "g", lwd = 2, phi = 20, main = "rect3D")

## 
## sgmn3D> # constant y and with transparent facets
## sgmn3D>  rect3D(x0 = 0, y0 = 0, z0 = 0, x1 = 1, z1 = 5,
## sgmn3D+         ylim = c(0, 1), facets = NA, border = "red",
## sgmn3D+         bty = "g", lwd = 2, phi = 20)

## 
## sgmn3D> # add rect at constant z, with colored facet
## sgmn3D>  rect3D(x0 = 0, y0 = 0, z0 = 0, x1 = 1, y1 = 1,
## sgmn3D+         border = "red", add = TRUE)
## 
## sgmn3D> ## ========================================================================
## sgmn3D> ## arrows added to a persp plot 
## sgmn3D> ## ========================================================================
## sgmn3D> 
## sgmn3D>  x <- y <- seq(-10, 10, length = 30)
## 
## sgmn3D>  z <- outer(x, y, FUN = function(x,y) x^2 + y^2)
## 
## sgmn3D>  persp3D(x, y, z, theta = 30, phi = 30, 
## sgmn3D+          col = "lightblue", ltheta = 120, shade = 0.75, 
## sgmn3D+          ticktype = "detailed", xlab = "X", 
## sgmn3D+          ylab = "Y", zlab = "x^2+y^2" )

## 
## sgmn3D> # Points where to put the arrows
## sgmn3D>  x <- y <- seq(-10, 10, len = 6)
## 
## sgmn3D>  X0 <- outer(x, y, FUN = function (x,y) x)
## 
## sgmn3D>  Y0 <- outer(x, y, FUN = function (x,y) y)
## 
## sgmn3D>  Z0 <- outer(x, y, FUN = function (x,y) x^2 + y^2)
## 
## sgmn3D>  X1 <- X0 + 1
## 
## sgmn3D>  Y1 <- Y0 + 1
## 
## sgmn3D>  Z1 <- Z0 + 10
## 
## sgmn3D>  arrows3D(X0, Y0, Z0, X1, Y1, Z1, lwd = 2, 
## sgmn3D+          add = TRUE, type = "curved", col = "red")
## 
## sgmn3D>  segments3D(X0, Y0, Z0, X0, Y0, rep(0, length(X0)), lwd = 2, 
## sgmn3D+          add = TRUE, col = "green")
## 
## sgmn3D> ## ========================================================================
## sgmn3D> ## polygon3D 
## sgmn3D> ## ========================================================================
## sgmn3D> 
## sgmn3D>  x <- runif(10)
## 
## sgmn3D>  y <- runif(10)
## 
## sgmn3D>  z <- runif(10)
## 
## sgmn3D>  polygon3D(x, y, z)

## 
## sgmn3D> # several polygons, separated by NAs
## sgmn3D>  x <- runif(39) 
## 
## sgmn3D>  y <- runif(39)
## 
## sgmn3D>  z <- runif(39)
## 
## sgmn3D>  ii <- seq(4, 36, by  = 4)
## 
## sgmn3D>  x[ii] <- y[ii] <- z[ii] <- NA 
## 
## sgmn3D> # transparent colors (alpha)
## sgmn3D>  polygon3D(x, y, z, border = "black", lwd = 3,
## sgmn3D+    col = gg.col(length(ii) + 1, alpha = 0.8), 
## sgmn3D+    main = "polygon3D")

## 
## sgmn3D> ## ========================================================================
## sgmn3D> ## 2D examples, with color key
## sgmn3D> ## ========================================================================
## sgmn3D> 
## sgmn3D> arrows2D(x0 = runif(10), y0 = runif(10), 
## sgmn3D+          x1 = runif(10), y1 = runif(10), colvar = 1:10, 
## sgmn3D+          code = 3, main = "arrows2D, segments2D")

## 
## sgmn3D> segments2D(x0 = runif(10), y0 = runif(10), 
## sgmn3D+          x1 = runif(10), y1 = runif(10), colvar = 1:10, 
## sgmn3D+          lwd = 2, add = TRUE, colkey = FALSE) 
## 
## sgmn3D> # transparency
## sgmn3D> rect2D(x0 = runif(10), y0 = runif(10), 
## sgmn3D+        x1 = runif(10), y1 = runif(10), colvar = 1:10, 
## sgmn3D+        alpha = 0.4, lwd = 2, main = "rect2D")

## 
## sgmn3D> ## ========================================================================
## sgmn3D> ## polygon2D 
## sgmn3D> ## ========================================================================
## sgmn3D> 
## sgmn3D>  x <- runif(10)
## 
## sgmn3D>  y <- runif(10)
## 
## sgmn3D>  polygon2D(x, y)    # same as polygon

## 
## sgmn3D> # several polygons, separated by NAs
## sgmn3D>  x <- runif(59) 
## 
## sgmn3D>  y <- runif(59)
## 
## sgmn3D>  ii <- seq(5, 55, by  = 5)
## 
## sgmn3D>  x[ii] <- y[ii] <- NA 
## 
## sgmn3D> # transparent colors (alpha)
## sgmn3D>  polygon2D(x, y, border = "black", lwd = 3,
## sgmn3D+    colvar = 1:(length(ii) + 1), 
## sgmn3D+    col = gg.col(), alpha = 0.2, 
## sgmn3D+    main = "polygon2D")

## 
## sgmn3D> # restore plotting parameters
## sgmn3D>  par(mfrow = pm)
example(image2D)
## 
## imag2D> # save plotting parameters
## imag2D>  pm <- par("mfrow")
## 
## imag2D> ## =======================================================================
## imag2D> ## Difference between x or y a vector/matrix and rasterImage
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  par(mfrow = c(2, 2))
## 
## imag2D>  x <- y <- 1:3
## 
## imag2D>  z <- matrix (nrow = 3, ncol = 3, data = 1:9)
## 
## imag2D>  image2D(z, x, y, border = "black")
## 
## imag2D>  image2D(z, x, y, rasterImage = TRUE, border = "black")
## 
## imag2D>  image2D(z, x = matrix(nrow = 3, ncol = 3, data = x), 
## imag2D+        y, border = "black")
## 
## imag2D>  image2D(z, x, y, border = "black", theta = 45)

## 
## imag2D> ## =======================================================================
## imag2D> ## shading, light, adding contours, points and lines
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  par(mfrow = c(2, 2))
## 
## imag2D>  nr <- nrow(volcano)
## 
## imag2D>  nc <- ncol(volcano)
## 
## imag2D>  image2D(volcano, x = 1:nr, y = 1:nc, lighting = TRUE, 
## imag2D+        main = "volcano", clab = "height, m")
## 
## imag2D>  abline(v = seq(10, 80, by = 10))
## 
## imag2D>  abline(h = seq(10, 60, by = 10))
## 
## imag2D>  points(50, 30, pch = 3, cex = 5, lwd = 3, col = "white")
## 
## imag2D>  image2D(z = volcano, x = 1:nr, y = 1:nc, lwd = 2, shade = 0.2,
## imag2D+        main = "volcano", clab = "height, m")
## 
## imag2D>  image2D(volcano, x = 1:nr, y = 1:nc, contour = TRUE, shade = 0.5, lphi = 0,
## imag2D+        col = "lightblue", main = "volcano")
## 
## imag2D>  image2D(volcano, x = 1:nr, y = 1:nc, col = jet.col(12),
## imag2D+        main = "volcano", clab = "height, m")

## 
## imag2D> ## =======================================================================
## imag2D> ## Contour plots
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  par(mfrow = c(2, 2))
## 
## imag2D>  V <- volcano - 150
## 
## imag2D> # default, no color key
## imag2D>  contour2D(z = V, colkey = FALSE, lwd = 2)
## 
## imag2D> # imposed levels
## imag2D>  contour2D(z = V, lwd = 2, levels = seq(-40, 40, by = 20))
## 
## imag2D> # negative levels dashed
## imag2D>  contour2D(z = V, col = "black", lwd = 2, 
## imag2D+            levels = seq(0, 40, by = 20))
## 
## imag2D>  contour2D(z = V, col = "black", lwd = 2, lty = 2, 
## imag2D+            levels = seq(-40, -20, by = 20), add = TRUE)
## 
## imag2D> # no labels, imposed number of levels, colorkey
## imag2D>  contour2D(z = V, lwd = 2, nlevels = 20, drawlabels = FALSE, 
## imag2D+            colkey = list(at = seq(-40, 40, by = 20)))

## 
## imag2D> ## =======================================================================
## imag2D> ## A large data set, input is an array
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  par(mfrow = c(1, 1))
## 
## imag2D>  image2D(z = Oxsat$val[, , 1], x = Oxsat$lon, y = Oxsat$lat,
## imag2D+        main = "surface oxygen saturation data 2005", NAcol = "black", 
## imag2D+        clab = c("","","%"))

## 
## imag2D> # images at first 9 depths - use subset to select them
## imag2D>  image2D(z = Oxsat$val, subset = 1:9, 
## imag2D+        x = Oxsat$lon, y = Oxsat$lat,
## imag2D+        margin = c(1, 2), NAcol = "black", 
## imag2D+        xlab = "longitude", ylab = "latitude", 
## imag2D+        zlim = c(0, 115),
## imag2D+        main = paste("depth ", Oxsat$depth[1:9], " m"),
## imag2D+        mfrow = c(3, 3))

## 
## imag2D> # images at latitude - depth section - increase resolution
## imag2D>  z <- Oxsat$val[,  Oxsat$lat > - 5 & Oxsat$lat < 5, ]
## 
## imag2D>  image2D(z = z, x = Oxsat$lon, y = Oxsat$depth,
## imag2D+        margin = c(1, 3), NAcol = "black", 
## imag2D+        resfac = 3, ylim = c(5000, 0))
## 
## imag2D> # show position of transects 
## imag2D>  image2D(z = Oxsat$val[ , ,1], 
## imag2D+        x = Oxsat$lon, y = Oxsat$lat,
## imag2D+        NAcol = "black")

## 
## imag2D>  abline(h = Oxsat$lat[Oxsat$lat > - 5 & Oxsat$lat < 5])      
## 
## imag2D> ## =======================================================================
## imag2D> ## Image of a list of matrices
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  listvolcano <- list(volcano = volcano, logvolcano = log(volcano)) 
## 
## imag2D>  image2D(listvolcano, x = 1:nr, y = 1:nc, contour = TRUE,
## imag2D+        main = c("volcano", "log(volcano)"), 
## imag2D+        clab = list("height, m", "log(m)"),
## imag2D+        zlim = list(c(80, 200), c(4.4, 5.5)))

## 
## imag2D> ## =======================================================================
## imag2D> ## Image of a list of arrays
## imag2D> ## =======================================================================
## imag2D> 
## imag2D> ## Not run: 
## imag2D> ##D # crude conversion from oxsat to oxygen 
## imag2D> ##D  listoxygen <- list(Oxsat$val, Oxsat$val/100 * 360)
## imag2D> ##D   
## imag2D> ##D  image2D(z = listoxygen, 
## imag2D> ##D        x = Oxsat$lon, y = Oxsat$lat,
## imag2D> ##D        margin = c(1, 2), NAcol = "black", 
## imag2D> ##D        main = c("Oxygen saturation ", " Oxygen concentration"),
## imag2D> ##D        mtext = paste("depth ", Oxsat$depth, " m")
## imag2D> ##D        )
## imag2D> ## End(Not run)
## imag2D> 
## imag2D> ## =======================================================================
## imag2D> ## 'x', 'y' and 'z' are matrices
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  par(mfrow = c(2, 1))
## 
## imag2D> # tilted x- and y-coordinates of 'volcano'
## imag2D>  volcx <- matrix(nrow = 87, ncol = 61, data = 1:87)
## 
## imag2D>  volcx <- volcx + matrix(nrow = 87, ncol = 61, 
## imag2D+         byrow = TRUE, data = seq(0., 15, length.out = 61))
## 
## imag2D>  volcy <- matrix(ncol = 87, nrow = 61, data = 1:61)
## 
## imag2D>  volcy <- t(volcy + matrix(ncol = 87, nrow = 61, 
## imag2D+         byrow = TRUE, data = seq(0., 25, length.out = 87)))
## 
## imag2D>  image2D(volcano, x = volcx, y = volcy)
## 
## imag2D> # use of panel function
## imag2D>  image2D(volcano, x = volcx, y = volcy, NAcol = "black", 
## imag2D+        panel.first = substitute(box(col = "lightgrey", lwd = 30)))

## 
## imag2D> ## =======================================================================
## imag2D> ## Image with NAs and logs
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  par(mfrow = c(2, 2))
## 
## imag2D> # normal volcano
## imag2D>  image2D(volcano, clab = c("height", "m"))
## 
## imag2D> # logarithmic z-axis
## imag2D>  image2D(volcano, log = "z", clab = c("height", "m"),
## imag2D+      main = "log='z'")
## 
## imag2D> # Including NAs
## imag2D>  VOLC <- volcano - 110
## 
## imag2D>  VOLC [VOLC <= 0] <- NA
## 
## imag2D>  image2D(VOLC, main = "including NAs and rescaled")
## 
## imag2D> # both
## imag2D>  image2D(VOLC, NAcol = "black", log = "z", zlim = c(1, 100),
## imag2D+      main = "NAs and log = 'z'")

## 
## imag2D> ## =======================================================================
## imag2D> ## Image with contour specification (alpha sets the transparency)
## imag2D> ## =======================================================================
## imag2D> 
## imag2D>  par(mfrow = c(1, 1))
## 
## imag2D>  image2D(volcano, shade = 0.2, rasterImage = TRUE,
## imag2D+    contour = list(col = "white", labcex = 0.8, lwd = 3, alpha = 0.5))

## 
## imag2D> # same:
## imag2D> ## Not run: 
## imag2D> ##D  image2D(z = volcano, shade = 0.2, rasterImage = TRUE)
## imag2D> ##D  contour2D(z = volcano, col = "white", labcex = 0.8, 
## imag2D> ##D    lwd = 3, alpha = 0.5, add = TRUE)
## imag2D> ## End(Not run)
## imag2D> # reset plotting parameters
## imag2D>  par(mfrow = pm)
example(image3D)
## 
## imag3D> # save plotting parameters
## imag3D>  pm <- par("mfrow")
## 
## imag3D> ## =======================================================================
## imag3D> ## images in x, y, z plane
## imag3D> ## =======================================================================
## imag3D> 
## imag3D>  par(mfrow = c(2, 2))
## 
## imag3D> # images in x, y, z plane
## imag3D> # We use colkey = list(plot = FALSE) to create room for a color key
## imag3D>  image3D(y = seq(0, 1, 0.1), z = seq(0, 1, 0.1), x = 0.5, 
## imag3D+    col = "blue", xlim = c(0,1), colkey = list(plot = FALSE))
## 
## imag3D>  image3D(x = seq(0, 1, 0.1), z = seq(0, 1, 0.1), y = 0.5, 
## imag3D+    add = TRUE, col = "red", alpha = 0.2)   # alpha makes it transparent
## 
## imag3D>  image3D(x = seq(0, 1, 0.1), y = seq(0, 1, 0.1), z = 0.5, 
## imag3D+    add = TRUE, col = "green")
## 
## imag3D>  colkey(col = c("green", "red", "blue"), clim = c(0.5, 3.5), 
## imag3D+    at = 1:3, labels = c("z", "y", "x"), add = TRUE)
## 
## imag3D> #
## imag3D>  image3D(z = 100, colvar = volcano, zlim = c(0, 150),
## imag3D+    clab = c("height", "m"))
## 
## imag3D> #
## imag3D>  image3D( x = 0.5, colvar = volcano, xlim = c(0, 1), 
## imag3D+    ylim = c(0, 1), zlim = c(0, 1))
## 
## imag3D>  image3D( y = 0.5, colvar = volcano, add = TRUE)
## 
## imag3D> #
## imag3D>  image3D( z = 1, colvar = volcano, 
## imag3D+    x = seq(0, 1, length.out = nrow(volcano)),
## imag3D+    y = seq(0, 1, length.out = ncol(volcano)), 
## imag3D+    xlim = c(0, 2), ylim = c(0, 2), zlim = c(0, 2))
## 
## imag3D>  image3D(y = 2, colvar = volcano, add = TRUE, 
## imag3D+     shade = 0.2,
## imag3D+     x = seq(0, 1, length.out = nrow(volcano)),
## imag3D+     z = seq(1, 2, length.out = ncol(volcano)))
## 
## imag3D>  image3D(x = 2, colvar = NULL, col = "orange", add = TRUE, 
## imag3D+     y = seq(0, 1, length.out = nrow(volcano)),
## imag3D+     z = seq(1, 2, length.out = ncol(volcano)))

## 
## imag3D> # reset plotting parameters
## imag3D>  par(mfrow = pm)
example(contour3D)
## 
## cntr3D> # save plotting parameters
## cntr3D>  pm <- par("mfrow")
## 
## cntr3D> ## =======================================================================
## cntr3D> ## Contours
## cntr3D> ## =======================================================================
## cntr3D>  par (mfrow = c(2, 2))
## 
## cntr3D>  r <- 1:nrow(volcano)
## 
## cntr3D>  c <- 1:ncol(volcano)
## 
## cntr3D>  contour3D(x = r, y = c, z = 100, colvar = volcano, zlim = c(0, 150),
## cntr3D+    clab = c("height", "m"))
## 
## cntr3D>  contour3D(x = 100, y = r, z = c, colvar = volcano, clab = c("height", "m"))
## 
## cntr3D>  contour3D(z = volcano, colvar = volcano, lwd = 2, 
## cntr3D+    nlevels = 20, clab = c("height", "m"), colkey = FALSE)
## 
## cntr3D>  contour3D(y = volcano, colvar = volcano, lwd = 2, 
## cntr3D+    nlevels = 10, clab = c("height", "m"))

## 
## cntr3D> ## =======================================================================
## cntr3D> ## Composite images and contours in 3D
## cntr3D> ## =======================================================================
## cntr3D>  persp3D(z = volcano, zlim = c(90, 300), col = "white", 
## cntr3D+          shade = 0.1, d = 2, plot = FALSE)
## 
## cntr3D>  contour3D(z = volcano, colvar = volcano, lwd = 2, add = TRUE, 
## cntr3D+          nlevels = 20, clab = c("height", "m"), plot = FALSE,
## cntr3D+          colkey = list(at = seq(90, 190, length.out = 5)))
## 
## cntr3D>  contour3D(z = 300, colvar = volcano, lwd = 2, col = "grey",
## cntr3D+          add = TRUE, nlevels = 5)
## 
## cntr3D> ## =======================================================================
## cntr3D> ## the viewing depth of contours (dDepth)
## cntr3D> ## =======================================================================
## cntr3D> 
## cntr3D> # too low
## cntr3D>  persp3D(z = volcano, col = "white", shade = 0.1, plot = FALSE)
## 
## cntr3D>  contour3D(z = volcano, colvar = volcano, lwd = 2, 
## cntr3D+          add = TRUE, dDepth = 0, col = "black")
## 
## cntr3D> # default
## cntr3D>  persp3D(z = volcano, col = "white", shade = 0.1, plot = FALSE)
## 
## cntr3D>  contour3D(z = volcano, colvar = volcano, lwd = 2, 
## cntr3D+          add = TRUE, dDepth = 0.1, col = "black")
## 
## cntr3D> # too high
## cntr3D>  persp3D(z = volcano, col = "white", shade = 0.1, plot = FALSE)
## 
## cntr3D>  contour3D(z = volcano, colvar = volcano, lwd = 1, 
## cntr3D+          add = TRUE, dDepth = 0.5, col = "black")

## 
## cntr3D> # reset plotting parameters
## cntr3D>  par(mfrow = pm)
example(colkey)
## 
## colkey> # save plotting parameters
## colkey>  pm <- par(mfrow = c(2, 2))
## 
## colkey>  pmar <- par(mar = c(5.1, 4.1, 4.1, 2.1))
## 
## colkey> ## =======================================================================
## colkey> ##  colorkey as argument of a plot3D function
## colkey> ## =======================================================================
## colkey> # default, colkey = NULL: adds colkey because multiple colors
## colkey>  image2D(z = volcano)
## 
## colkey> # default, colkey = NULL: no colkey because only one color
## colkey>  image2D(z = volcano, col = "grey", shade = 0.2, contour = TRUE)
## 
## colkey> # colkey = FALSE: no color key, no extra space foreseen
## colkey>  image2D(z = volcano, colkey = FALSE)
## 
## colkey> # colkey = list(plot = FALSE): no color key, extra space foreseen
## colkey>  image2D(z = volcano, colkey = list(plot = FALSE, side = 3))
## 
## colkey>  colkey (side = 3, add = TRUE, clim = range(volcano))

## 
## colkey> ## =======================================================================
## colkey> ##  colorkey in new plot
## colkey> ## =======================================================================
## colkey>  
## colkey>  colkey(side = 1, clim = c(0, 1), add = FALSE, clab = "z", 
## colkey+    col.clab = "red", adj.clab = 0)
## 
## colkey>  colkey(side = 2, clim = c(0, 1), clab = "z", length = 0.5, width = 0.5)
## 
## colkey>  colkey(side = 3, clim = c(0, 1), lwd = 3, clab = c("a","b","c","d"), 
## colkey+    line.clab = 5)
## 
## colkey>  colkey(side = 4, clim = c(1e-6, 1), clog = TRUE, 
## colkey+    clab = "a very long title in bold and close to the key", 
## colkey+    line.clab = 1, side.clab = 2, font.clab = 2)

## 
## colkey> ## =======================================================================
## colkey> ##  colorkey added to existing plot
## colkey> ## =======================================================================
## colkey> 
## colkey>  par(mfrow = c(1, 1))
## 
## colkey>  image2D(volcano, xlab = "", clab = "m", 
## colkey+        colkey = list(side = 1, length = 0.5, width = 0.5, 
## colkey+          line.clab = 1))
## 
## colkey>  colkey(side = 3, clim = range(volcano), add = TRUE)

## 
## colkey> # 'dist' to put colkey within the image 
## colkey> # 'shift' to position colkey to the right or upward
## colkey>  par(mfrow = c(1, 1))
## 
## colkey>  image2D(volcano, colkey = FALSE)
## 
## colkey>  colkey(clim = range(volcano), dist = -0.15, shift = 0.2,
## colkey+         side = 3, add = TRUE, clab = "key 1", col.clab = "white",
## colkey+         length = 0.5, width = 0.5, col.axis = "white", 
## colkey+         col.ticks = "white", cex.axis = 0.8)
## 
## colkey>  colkey(clim = range(volcano), dist = -0.1, shift = -0.2,
## colkey+         side = 4, add = TRUE, clab = "key 2", col.clab = "white",
## colkey+         length = 0.3, width = 0.5, col.axis = "white", 
## colkey+         col.ticks = "white", col.box = "red", cex.axis = 0.8)
## 
## colkey>  colkey(clim = range(volcano), dist = -0.3, 
## colkey+         side = 1, add = TRUE, clab = "key 3", col.clab = "white",
## colkey+         length = 0.3, width = 0.5, col.axis = "white", 
## colkey+         col.ticks = "white", at  = c(100, 140, 180), 
## colkey+         labels = c("a", "b", "c"), font = 2)
## 
## colkey>  colkey(clim = range(volcano), dist = -0.3, shift = -0.2,
## colkey+         side = 2, add = TRUE, clab = "key 4", col.clab = "white",
## colkey+         length = 0.3, width = 0.5, col.axis = "white", 
## colkey+         col.ticks = "white", col.box = "red", cex.axis = 0.8,
## colkey+         las = 3)

## 
## colkey> ## =======================================================================
## colkey> ##  colorkey in other plots
## colkey> ## =======================================================================
## colkey> 
## colkey>  par(mfrow = c(1, 1))
## 
## colkey>  par(mar = par("mar") + c(0, 0, -2, 0))
## 
## colkey>  image2D(volcano, clab = "height, m", 
## colkey+        colkey = list(dist = -0.15, shift = 0.2,
## colkey+        side = 3, length = 0.5, width = 0.5, line.clab = 2.5,
## colkey+        cex.clab = 2, col.clab = "white", col.axis = "white", 
## colkey+        col.ticks = "white", cex.axis = 0.8))

## 
## colkey> ## =======================================================================
## colkey> ## Several color keys in composite plot
## colkey> ## =======================================================================
## colkey> 
## colkey>  persp3D(z = volcano, zlim = c(-60, 200), phi = 20, bty = "b",   
## colkey+     colkey = list(length = 0.2, width = 0.4, shift = 0.15,
## colkey+       cex.axis = 0.8, cex.clab = 0.85), lighting = TRUE, lphi = 90,
## colkey+     clab = c("height","m"), plot = FALSE)
## 
## colkey> # create gradient in x-direction
## colkey>  Vx <- volcano[-1, ] - volcano[-nrow(volcano), ]
## 
## colkey> # add as image with own color key, at bottom 
## colkey>  image3D(z = -60, colvar = Vx/10, add = TRUE, 
## colkey+     colkey = list(length = 0.2, width = 0.4, shift = -0.15,
## colkey+       cex.axis = 0.8, cex.clab = 0.85),
## colkey+    clab = c("gradient","m/m"), plot = TRUE)

## 
## colkey> ## =======================================================================
## colkey> ## categorical colors; use addlines = TRUE to separate colors
## colkey> ## =======================================================================
## colkey> 
## colkey>  with(iris, scatter3D(x = Sepal.Length, y = Sepal.Width, 
## colkey+    z = Petal.Length, colvar = as.integer(Species), 
## colkey+    col = c("orange", "green", "lightblue"), pch = 16, cex = 2,  
## colkey+    clim = c(1, 3), ticktype = "detailed", phi = 20,
## colkey+    xlab = "Sepal Length", ylab = "Sepal Width", 
## colkey+    zlab = "Petal Length",  main = "iris",
## colkey+    colkey = list(at = c(1.33, 2, 2.66), side = 1, 
## colkey+    addlines = TRUE, length = 0.5, width = 0.5,
## colkey+    labels = c("setosa", "versicolor", "virginica") )))

## 
## colkey> # reset plotting parameters
## colkey>  par(mfrow = pm)
## 
## colkey>  par(mar = pmar)
example(jet.col)
## 
## jet.cl> # save plotting parameters
## jet.cl>  pm <- par("mfrow")
## 
## jet.cl>  pmar <- par("mar")
## 
## jet.cl> ## =======================================================================
## jet.cl> ## Transparency and various color schemes
## jet.cl> ## =======================================================================
## jet.cl> 
## jet.cl>  par(mfrow = c(3, 3))
## 
## jet.cl>  for (alph in c(0.25, 0.75))
## jet.cl+    image2D(volcano, alpha = alph, 
## jet.cl+          main = paste("jet.col, alpha = ", alph))
## 
## jet.cl>  image2D(volcano, main = "jet.col")
## 
## jet.cl>  image2D(volcano, col = jet2.col(100), main = "jet2.col")
## 
## jet.cl>  image2D(volcano, col = gg.col(100), main = "gg.col")
## 
## jet.cl>  image2D(volcano, col = gg2.col(100), main = "gg2.col")
## 
## jet.cl>  image2D(volcano, col = rainbow(100), main = "rainbow")
## 
## jet.cl>  image2D(volcano, col = terrain.colors(100), main = "terrain.colors")
## 
## jet.cl>  image2D(volcano, col = ramp.col(c("blue", "yellow", "green", "red")),
## jet.cl+        main = "ramp.col")

## 
## jet.cl> ## =======================================================================
## jet.cl> ## Shading, lighting -  one color
## jet.cl> ## =======================================================================
## jet.cl> 
## jet.cl> # create grid matrices
## jet.cl>  X      <- seq(0, pi, length.out = 50)
## 
## jet.cl>  Y      <- seq(0, 2*pi, length.out = 50)
## 
## jet.cl>  M      <- mesh(X, Y)
## 
## jet.cl>  phi    <- M$x
## 
## jet.cl>  theta  <- M$y
## 
## jet.cl> # x, y and z grids
## jet.cl>  x <- sin(phi) * cos(theta)
## 
## jet.cl>  y <- cos(phi)
## 
## jet.cl>  z <- sin(phi) * sin(theta)
## 
## jet.cl> # these are the defaults
## jet.cl>  p <- list(ambient = 0.3, diffuse = 0.6, specular = 1.,
## jet.cl+            exponent = 20, sr = 0, alpha = 1)
## 
## jet.cl>  par(mfrow = c(3, 3), mar = c(0, 0, 0, 0))
## 
## jet.cl>  Col <- "red"
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, shade = 0.9)
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = TRUE)
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = list(ambient = 0))
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = list(diffuse = 0))
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = list(diffuse = 1))
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = list(specular = 0))
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = list(exponent = 5))
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = list(exponent = 50))
## 
## jet.cl>  surf3D(x, y, z, box = FALSE, col = Col, lighting = list(sr = 1))

## 
## jet.cl> ## =======================================================================
## jet.cl> ## Shading, lighting with default colors
## jet.cl> ## =======================================================================
## jet.cl> 
## jet.cl>  x <- seq(-pi, pi, len = 100)
## 
## jet.cl>  y <- seq(-pi, pi, len = 100)
## 
## jet.cl>  grid <- mesh(x, y)
## 
## jet.cl>  z    <- with(grid, cos(x) * sin(y))
## 
## jet.cl>  cv   <- with(grid, -cos(y) * sin(x))
## 
## jet.cl> # lphi = 180, ltheta = -130  - good for shade
## jet.cl> # lphi = 90, ltheta = 0  - good for lighting
## jet.cl> 
## jet.cl>  par(mfrow = c(2, 2))
## 
## jet.cl>  persp3D(z = z, x = x, y = y, colvar = cv, zlim = c(-3, 3), colkey = FALSE)
## 
## jet.cl>  persp3D(z = z, x = x, y = y, colvar = cv, zlim = c(-3, 3), 
## jet.cl+        lighting = TRUE, colkey = FALSE)
## 
## jet.cl>  persp3D(z = z, x = x, y = y, colvar = cv, zlim = c(-3, 3), 
## jet.cl+        shade = 0.25, colkey = FALSE)
## 
## jet.cl>  persp3D(z = z, x = x, y = y, colvar = cv, zlim = c(-3, 3), 
## jet.cl+        lighting = TRUE, lphi = 90, ltheta = 0, colkey = FALSE)

## 
## jet.cl> ## =======================================================================
## jet.cl> ## transparency of a vector of colors
## jet.cl> ## =======================================================================
## jet.cl> 
## jet.cl>  par(mfrow = c(1, 1))
## 
## jet.cl>  x <- runif(19)
## 
## jet.cl>  y <- runif(19)
## 
## jet.cl>  z <- runif(19)
## 
## jet.cl> # split into 5 sections (polygons) 
## jet.cl>  ii <- seq(4, 19, by = 4)
## 
## jet.cl>  x[ii] <- y[ii] <- z[ii] <- NA
## 
## jet.cl>  polygon3D(x, y, z, border = "black", lwd = 2, 
## jet.cl+    col = alpha.col(c("red", "lightblue", "yellow", "green", "black"), 
## jet.cl+                   alpha = 0.4))

## 
## jet.cl> # the same, now passing alpha as an argument to polygon3D:
## jet.cl> ## Not run: 
## jet.cl> ##D  polygon3D(x, y, z, border = "black", lwd = 2, 
## jet.cl> ##D    col = c("red", "lightblue", "yellow", "green", "black"), 
## jet.cl> ##D                   alpha = 0.4)
## jet.cl> ## End(Not run)
## jet.cl> # reset plotting parameters
## jet.cl>  par(mfrow = pm)
## 
## jet.cl>  par(mar = pmar)
example(perspbox)
## 
## prspbx> # save plotting parameters                            
## prspbx>  pm   <- par("mfrow")
## 
## prspbx>  pmar <- par("mar")
## 
## prspbx> ## ========================================================================
## prspbx> ## The 4 predefined box types
## prspbx> ## ========================================================================
## prspbx> 
## prspbx>  par(mfrow = c(2, 2), mar = c(1, 1, 1, 1))
## 
## prspbx> # box type with only backward panels
## prspbx>  perspbox(z = volcano, bty = "b", ticktype = "detailed", d = 2, 
## prspbx+           main  = "bty = 'b'")
## 
## prspbx> # box as in 'persp'
## prspbx>  perspbox(z = volcano, bty = "f", ticktype = "detailed", 
## prspbx+           d = 2, main  = "bty = 'f'")
## 
## prspbx> # back panels with gridlines, detailed axes
## prspbx>  perspbox(z = volcano, bty = "b2", ticktype = "detailed", 
## prspbx+           d = 2, main  = "bty = 'b2'")
## 
## prspbx> # ggplot-type, simple axes 
## prspbx>  perspbox(z = volcano, bty = "g", 
## prspbx+           d = 2, main  = "bty = 'g'")

## 
## prspbx> ## ========================================================================
## prspbx> ## A user-defined box
## prspbx> ## ========================================================================
## prspbx> 
## prspbx>  par(mfrow = c(1, 1))
## 
## prspbx>  perspbox(z = diag(2), bty = "u", ticktype = "detailed", 
## prspbx+           col.panel = "gold", col.axis = "white",  
## prspbx+           scale = FALSE, expand = 0.4, 
## prspbx+           col.grid = "grey", main = "user-defined")

## 
## prspbx> # restore plotting parameters
## prspbx>  par(mfrow = pm)
## 
## prspbx>  par(mar = pmar)
example(mesh)
## 
## mesh> ## ========================================================================
## mesh> ## 2-D mesh
## mesh> ## ========================================================================
## mesh> 
## mesh>  x <- c(-1 , 0, 1)
## 
## mesh>  y <- 1 : 4
## 
## mesh> # 2-D mesh
## mesh>  (M <- mesh(x, y))
## $x
##      [,1] [,2] [,3] [,4]
## [1,]   -1   -1   -1   -1
## [2,]    0    0    0    0
## [3,]    1    1    1    1
## 
## $y
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    1    2    3    4
## [3,]    1    2    3    4
## 
## 
## mesh> # calculate with this mesh
## mesh>  V <- with (M, x/2 * sin(y))
## 
## mesh> # same as:
## mesh>  V2 <- outer(x, y, FUN = function(x, y) x/2*sin(y))
## 
## mesh> ## ========================================================================
## mesh> ## 3-D mesh
## mesh> ## ========================================================================
## mesh> 
## mesh>  x <- y <- z <- c(-1 , 0, 1)
## 
## mesh> # 3-D mesh
## mesh>  (M <- mesh(x, y, z))
## $x
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]    0    0    0
## [3,]    1    1    1
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]    0    0    0
## [3,]    1    1    1
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]    0    0    0
## [3,]    1    1    1
## 
## 
## $y
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   -1    0    1
## [2,]   -1    0    1
## [3,]   -1    0    1
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   -1    0    1
## [2,]   -1    0    1
## [3,]   -1    0    1
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]   -1    0    1
## [2,]   -1    0    1
## [3,]   -1    0    1
## 
## 
## $z
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]   -1   -1   -1
## [3,]   -1   -1   -1
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    0    0    0
## [2,]    0    0    0
## [3,]    0    0    0
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    1    1    1
## [3,]    1    1    1
## 
## 
## 
## mesh> # calculate with 3-D mesh
## mesh>  V <- with (M, x/2 * sin(y) *sqrt(z+2))
## 
## mesh> # plot result
## mesh>  scatter3D(M$x, M$y, M$z, V, pch = "+", cex = 3, colkey = FALSE)

example(trans3D)
## 
## trns3D> ## ========================================================================
## trns3D> ## 3-D mesh
## trns3D> ## ========================================================================
## trns3D> 
## trns3D>  x <- y <- z <- c(-1 , 0, 1)
## 
## trns3D> # plot a 3-D mesh
## trns3D>  (M <- mesh(x, y, z))
## $x
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]    0    0    0
## [3,]    1    1    1
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]    0    0    0
## [3,]    1    1    1
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]    0    0    0
## [3,]    1    1    1
## 
## 
## $y
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   -1    0    1
## [2,]   -1    0    1
## [3,]   -1    0    1
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   -1    0    1
## [2,]   -1    0    1
## [3,]   -1    0    1
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]   -1    0    1
## [2,]   -1    0    1
## [3,]   -1    0    1
## 
## 
## $z
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]   -1   -1   -1
## [2,]   -1   -1   -1
## [3,]   -1   -1   -1
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    0    0    0
## [2,]    0    0    0
## [3,]    0    0    0
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    1    1    1
## [3,]    1    1    1
## 
## 
## 
## trns3D> # plot result
## trns3D>  pmat <- scatter3D(M$x, M$y, M$z, pch = "+", cex = 3, colkey = FALSE)

## 
## trns3D> # add line
## trns3D>  XY <- trans3D(x = c(-1, 1), y = c(-1, 1), z = c(-1, 1), pmat = pmat) 
## 
## trns3D>  lines(XY, lwd = 2, col = "blue")
## 
## trns3D> ## ========================================================================
## trns3D> ## Example 2
## trns3D> ## ========================================================================
## trns3D> 
## trns3D>  pmat <- perspbox (z = diag(2))

## 
## trns3D>  XY <- trans3D(x = runif(30), y = runif(30), z = runif(30), pmat = pmat) 
## 
## trns3D>  polygon(XY, col = "darkblue")
example(plot.plist)
## 
## plt.pl> # save plotting parameters                            
## plt.pl>  pm   <- par("mfrow")
## 
## plt.pl>  pmar <- par("mar")
## 
## plt.pl> ## ========================================================================
## plt.pl> ## The volcano
## plt.pl> ## ========================================================================
## plt.pl> 
## plt.pl>  par(mfrow = c(2, 2), mar = c(2, 2, 2, 2))
## 
## plt.pl> # The volcano at lower resolution
## plt.pl>  x <- seq(1, nrow(volcano), by = 2)
## 
## plt.pl>  y <- seq(1, ncol(volcano), by = 2)
## 
## plt.pl>  V <- volcano[x,y]
## 
## plt.pl>  persp3D(z = V)
## 
## plt.pl> # rotate
## plt.pl>  plotdev(theta = 0)
## 
## plt.pl> # light and transparence
## plt.pl>  plotdev(lighting  = TRUE, lphi = 90, alpha = 0.6)
## 
## plt.pl> # zoom
## plt.pl>  plotdev(xlim = c(0.2, 0.6), ylim = c(0.2, 0.6), phi = 60)

## 
## plt.pl> ## ========================================================================
## plt.pl> ## Two spheres 
## plt.pl> ## ========================================================================
## plt.pl> 
## plt.pl>  par(mfrow = c(1, 1), mar = c(0, 0, 0, 0))
## 
## plt.pl> # create a sphere
## plt.pl>  M  <- mesh(seq(0, 2*pi, length.out = 30),
## plt.pl+             seq(0,   pi, length.out = 30))
## 
## plt.pl>  u  <- M$x ; v  <- M$y
## 
## plt.pl>  x <- cos(u)*sin(v)
## 
## plt.pl>  y <- sin(u)*sin(v)
## 
## plt.pl>  z <- cos(v)
## 
## plt.pl>  surf3D(x = 2*x, y = 2*y, z = 2*z, 
## plt.pl+         colvar = NULL, lighting = TRUE, #plot = FALSE,
## plt.pl+         facets = NA, col = "blue", lwd = 5)

## 
## plt.pl>  surf3D(x, y, z, colvar = NULL, lighting = TRUE, 
## plt.pl+         col = "red", add = TRUE)
## 
## plt.pl>  names(getplist())
##  [1] "type"     "plt"      "persp"    "alpha"    "setlim"   "xlim"    
##  [7] "ylim"     "zlim"     "scalefac" "mat"      "dot"      "imgnr"   
## [13] "img"      "poly"    
## 
## plt.pl> # plot with different view:
## plt.pl>  plotdev(phi = 0)

## 
## plt.pl> ## Not run: 
## plt.pl> ##D   # will plot same 3-D graph to pdf
## plt.pl> ##D  pdf(file = "save.pdf")
## plt.pl> ##D  plotdev()
## plt.pl> ##D  dev.off()
## plt.pl> ## End(Not run)
## plt.pl>              
## plt.pl> ## ========================================================================
## plt.pl> ## Two spheres and two planes 
## plt.pl> ## ========================================================================
## plt.pl> 
## plt.pl>  par(mar = c(2, 2, 2, 2))
## 
## plt.pl> # equation of a sphere
## plt.pl>  M  <- mesh(seq(0, 2*pi, length.out = 100),                                     -
## plt.pl+             seq(0,   pi, length.out = 100))
## 
## plt.pl>  u  <- M$x ; v  <- M$y
## 
## plt.pl>  x <- cos(u)*sin(v)
## 
## plt.pl>  y <- sin(u)*sin(v)
## 
## plt.pl>  z <- cos(v)
## 
## plt.pl>  surf3D(x, y, z, colvar = z, 
## plt.pl+         theta = 45, phi = 20, bty = "b",
## plt.pl+         xlim = c(-1.5, 1.5), ylim = c(-1, 2), 
## plt.pl+         zlim = c(-1.5, 1.5), plot = FALSE)
## 
## plt.pl> # add a second sphere, shifted 1 unit to the right on y-axis; 
## plt.pl> # no facets drawn for this sphere 
## plt.pl>  surf3D (x, y+1, z, colvar = z, add = TRUE, 
## plt.pl+          facets = FALSE, plot = FALSE)
## 
## plt.pl> # define a plane at z = 0
## plt.pl>  Nx <- 100
## 
## plt.pl>  Ny <- 100
## 
## plt.pl>  x <- seq(-1.5, 1.5, length.out = Nx)
## 
## plt.pl>  y <- seq(-1, 2, length.out = Ny)
## 
## plt.pl>  image3D (x = x, y = y, z = 0, add = TRUE, colvar = NULL, 
## plt.pl+           col = "blue", facets = TRUE, plot = FALSE)
## 
## plt.pl> # another, small plane at y = 0 - here x and y have to be matrices!
## plt.pl>  x <- seq(-1., 1., length.out = 50)
## 
## plt.pl>  z <- seq(-1., 1., length.out = 50)
## 
## plt.pl>  image3D (x = x, y = 0, z = z, colvar = NULL, 
## plt.pl+          add = TRUE, col = NA, border = "blue", 
## plt.pl+          facets = TRUE, plot = TRUE)

## 
## plt.pl> ## Not run: 
## plt.pl> ##D   # rotate 
## plt.pl> ##D  for (angle in seq(0, 360, by = 10)) 
## plt.pl> ##D    plotdev(theta = angle)
## plt.pl> ## End(Not run)
## plt.pl> 
## plt.pl> ## ========================================================================
## plt.pl> ## Zooming, rescaling, lighting,...
## plt.pl> ## ========================================================================
## plt.pl> 
## plt.pl>  par(mfrow = c(2, 2)) 
## 
## plt.pl> # The volcano
## plt.pl>  x <- seq(1, nrow(volcano), by = 2)
## 
## plt.pl>  y <- seq(1, ncol(volcano), by = 2)
## 
## plt.pl>  V <- volcano[x,y]
## 
## plt.pl> # plot the volcano
## plt.pl>  persp3D (x, y, z = V, colvar = V, theta = 10, phi = 20, 
## plt.pl+           box = FALSE, scale = FALSE, expand = 0.3, 
## plt.pl+           clim = range(V), plot = FALSE)
## 
## plt.pl> # add a plane (image) at z = 170; jetcolored, transparant: only border
## plt.pl>  image3D(x, y, z = 170, add = TRUE, clim = range(V), 
## plt.pl+          colvar = V, facets = NA, plot = FALSE, colkey = FALSE)
## 
## plt.pl> # add a contour (image) at z = 170; jetcolored, 
## plt.pl>  contour3D(x, y, z = 170, add = TRUE, clim = range(V),
## plt.pl+            colvar = V, plot = FALSE, colkey = FALSE)
## 
## plt.pl> # plot it  - 
## plt.pl>  plot(getplist())   #  same as plotdev()
## 
## plt.pl> # plot but with different expansion
## plt.pl>  plotdev(expand = 1)
## 
## plt.pl> # other perspective, and shading
## plt.pl>  plotdev(d = 2, r = 10, shade = 0.3)
## 
## plt.pl> # zoom and rotate
## plt.pl>  plotdev(xlim = c(10, 30), ylim = c(20, 30), phi = 50)

## 
## plt.pl> ## ========================================================================
## plt.pl> ## Using setplist
## plt.pl> ## ========================================================================
## plt.pl> 
## plt.pl>  polygon3D(runif(3), runif(3), runif(3))
## 
## plt.pl> # retrieve plotting list
## plt.pl>  plist <- getplist()
## 
## plt.pl>  names(plist)
##  [1] "type"     "plt"      "persp"    "alpha"    "setlim"   "xlim"    
##  [7] "ylim"     "zlim"     "scalefac" "mat"      "dot"      "imgnr"   
## [13] "img"      "poly"    
## 
## plt.pl>  plist$poly
## $x
##            [,1]
## [1,] 0.55688801
## [2,] 0.03582941
## [3,] 0.26833985
## [4,]         NA
## 
## $y
##            [,1]
## [1,] 0.55313297
## [2,] 0.24244496
## [3,] 0.02195141
## [4,]         NA
## 
## $z
##            [,1]
## [1,] 0.04898323
## [2,] 0.23072239
## [3,] 0.75517564
## [4,]         NA
## 
## $col
## [1] "grey"
## 
## $border
## [1] NA
## 
## $lwd
## [1] 1
## 
## $lty
## [1] 1
## 
## $alpha
## [1] NA
## 
## $isimg
## [1] 0
## 
## $proj
## [1] -4.448447
## 
## attr(,"class")
## [1] "poly"
## 
## plt.pl> # change copy of plotting list
## plt.pl>  plist$poly$col <- "red"
## 
## plt.pl> # update internal plotting list
## plt.pl>  setplist(plist)
## 
## plt.pl> # plot updated list
## plt.pl>  plotdev()
## 
## plt.pl> ## ========================================================================
## plt.pl> ## Using selectplist
## plt.pl> ## ========================================================================
## plt.pl> 
## plt.pl>  polygon3D(runif(10), runif(10), runif(10), col = "red", 
## plt.pl+    alpha = 0.2, plot = FALSE, ticktype = "detailed", 
## plt.pl+    xlim = c(0,1), ylim = c(0, 1), zlim = c(0, 1))
## 
## plt.pl>  polygon3D(runif(10)*0.5, runif(10), runif(10), col = "yellow", 
## plt.pl+    alpha = 0.2, plot = FALSE, add = TRUE)
## 
## plt.pl>  polygon3D(runif(10)*0.5+0.5, runif(10), runif(10), col = "green", 
## plt.pl+    alpha = 0.2, plot = FALSE, add = TRUE)
## 
## plt.pl>  points3D(runif(10), runif(10), runif(10), col = "blue", 
## plt.pl+    add = TRUE, plot = FALSE)
## 
## plt.pl>  segments3D(x0 = runif(10), y0 = runif(10), z0 = runif(10), 
## plt.pl+    x1 = runif(10), y1 = runif(10), z1 = runif(10), 
## plt.pl+    colvar = 1:10, add = TRUE, lwd = 3)
## 
## plt.pl> # retrieve plotting list
## plt.pl>  plist <- getplist()
## 
## plt.pl> # selection function 
## plt.pl>  SS <- function (x, y, z)  {
## plt.pl+    sel <- rep(TRUE, length.out = length(x))
## plt.pl+    sel[x < 0.5] <- FALSE
## plt.pl+    return(sel)
## plt.pl+  } 
## 
## plt.pl> # The whole polygon will be removed or kept.  
## plt.pl>  plot(x = selectplist(plist, SS), 
## plt.pl+    xlim = c(0, 1), ylim = c(0, 1), zlim = c(0, 1))

## 
## plt.pl> # restore plotting parameters
## plt.pl>  par(mfrow = pm)
## 
## plt.pl>  par(mar = pmar)
example(ImageOcean)
## 
## ImgOcn> # save plotting parameters
## ImgOcn>  pm <- par("mfrow")
## 
## ImgOcn>  mar <- par("mar")
## 
## ImgOcn> ## =======================================================================
## ImgOcn> ## Images of the hypsometry
## ImgOcn> ## =======================================================================
## ImgOcn> 
## ImgOcn>  par(mfrow = c(2, 2))
## 
## ImgOcn>  image2D(Hypsometry, asp = TRUE, xlab = expression(degree*E), 
## ImgOcn+    ylab =  expression(degree*N), contour = TRUE)
## 
## ImgOcn> # remove ocean
## ImgOcn>  zz         <- Hypsometry$z
## 
## ImgOcn>  zz[zz < 0] <- NA
## 
## ImgOcn>  image2D(zz, x = Hypsometry$x, y = Hypsometry$y, NAcol = "black")
## 
## ImgOcn> ## =======================================================================
## ImgOcn> ## A short version for plotting the Ocean's bathymetry
## ImgOcn> ## =======================================================================
## ImgOcn> 
## ImgOcn>  ImageOcean(asp = TRUE, contour = TRUE)
## 
## ImgOcn>  ImageOcean(col = "white", 
## ImgOcn+    contour = list(levels = seq(-6000, 0, by = 2000)))

## 
## ImgOcn> ## =======================================================================
## ImgOcn> ## A complex image of part of the ocean 
## ImgOcn> ## =======================================================================
## ImgOcn> 
## ImgOcn> # elaborate version
## ImgOcn>  par(mfrow = c(1, 1), mar = c(2, 2, 2, 2))
## 
## ImgOcn>  ii <- which(Hypsometry$x > -50 & Hypsometry$x < -20)
## 
## ImgOcn>  jj <- which(Hypsometry$y >  10 & Hypsometry$y <  40)
## 
## ImgOcn> # Draw empty persp box
## ImgOcn>  zlim <- c(-10000, 0)
## 
## ImgOcn>  pmat <- perspbox(z = Hypsometry$z[ii, jj], 
## ImgOcn+                   xlab = "longitude", ylab = "latitude", zlab = "depth", 
## ImgOcn+                   expand = 0.5, d = 2, zlim = zlim, phi = 20, theta = 30,
## ImgOcn+                   colkey = list(side = 1))
## 
## ImgOcn> # A function that makes a black panel with grey edge:
## ImgOcn>  panelfunc <- function(x, y, z) {
## ImgOcn+     XY <- trans3D(x, y, z, pmat = pmat)
## ImgOcn+     polygon(XY$x, XY$y, col = "black", border = "grey")
## ImgOcn+  }
## 
## ImgOcn> # left panel
## ImgOcn>  panelfunc(x = c(0, 0, 0, 0), y = c(0, 0, 1, 1), 
## ImgOcn+            z = c(zlim[1], zlim[2], zlim[2], zlim[1]))
## 
## ImgOcn> # back panel
## ImgOcn>  panelfunc(x = c(0, 0, 1, 1), y = c(1, 1, 1, 1),
## ImgOcn+            z = c(zlim[1], zlim[2], zlim[2], zlim[1]))
## 
## ImgOcn> # bottom panel
## ImgOcn>  panelfunc(x = c(0, 0, 1, 1), y = c(0, 1, 1, 0),
## ImgOcn+            z = c(zlim[1], zlim[1], zlim[1], zlim[1]))
## 
## ImgOcn> # Actual bathymetry, 2 times increased resolution, with contours
## ImgOcn>  persp3D(z = Hypsometry$z[ii,jj], add = TRUE, resfac = 2,  
## ImgOcn+        contour = list(col = "grey", side = c("zmin", "z")), 
## ImgOcn+        zlim = zlim, clab = "depth, m", 
## ImgOcn+        colkey = list(side = 1, length = 0.5, dist = -0.1))

## 
## ImgOcn> # shorter alternative for same plot, higher resolution
## ImgOcn> ## Not run: 
## ImgOcn> ##D  persp3D(z = Hypsometry$z[ii,jj], resfac = 4,  
## ImgOcn> ##D        contour = list(col = "grey", side = c("zmin", "z")), 
## ImgOcn> ##D        zlim = zlim, clab = "depth, m", bty = "bl2",
## ImgOcn> ##D        xlab = "longitude", ylab = "latitude", zlab = "depth", 
## ImgOcn> ##D        expand = 0.5, d = 2, phi = 20, theta = 30,
## ImgOcn> ##D        colkey = list(side = 1, length = 0.5, dist = -0.1))
## ImgOcn> ## End(Not run)
## ImgOcn> 
## ImgOcn> # reset plotting parameters
## ImgOcn>  par(mfrow = pm)
## 
## ImgOcn>  par(mar = mar)
example(Oxsat)
## 
## Oxsat> # save plotting parameters
## Oxsat>  pm <- par("mfrow")
## 
## Oxsat> ## ========================================================================
## Oxsat> ## plot all surface data
## Oxsat> ## ========================================================================
## Oxsat> 
## Oxsat>  par(mfrow = c(1, 1))
## 
## Oxsat>  image2D(z = Oxsat$val[ , , 1], x = Oxsat$lon, y = Oxsat$lat,
## Oxsat+        main = "surface oxygen saturation (%) for 2005")

## 
## Oxsat> ## ========================================================================
## Oxsat> ## plot a selection of latitude-depth profiles; input is an array
## Oxsat> ## ========================================================================
## Oxsat> 
## Oxsat>  lon <- Oxsat$lon
## 
## Oxsat>  image2D (z = Oxsat$val, margin = c(2, 3), x = Oxsat$lat, 
## Oxsat+         y = Oxsat$depth, subset = (lon > 18 & lon < 23),
## Oxsat+         ylim = c(5500, 0), NAcol = "black", zlim = c(0, 110),
## Oxsat+         xlab = "latitude", ylab = "depth, m")
## 
## Oxsat>  ImageOcean()

## 
## Oxsat>  abline ( v = lon[lon > 18 & lon < 23])
## 
## Oxsat> ## ========================================================================
## Oxsat> ## plot with slices
## Oxsat> ## ========================================================================
## Oxsat> 
## Oxsat>  par(mfrow = c(1, 1))
## 
## Oxsat>  ii <- which (Oxsat$lon > -90 & Oxsat$lon < 90)
## 
## Oxsat>  jj <- which (Oxsat$lat > 0 & Oxsat$lat < 90)
## 
## Oxsat>  xs <- Oxsat$lon[ii[length(ii)]]  # E boundary
## 
## Oxsat>  ys <- Oxsat$lat[jj[1]]           # S boundary
## 
## Oxsat>  slice3D(colvar = Oxsat$val[ii,jj,], x = Oxsat$lon[ii],  
## Oxsat+         y = Oxsat$lat[jj], z = -Oxsat$depth,
## Oxsat+         NAcol = "black", xs = xs, ys = ys, zs = 0, 
## Oxsat+         theta = 35, phi = 50, colkey = list(length = 0.5),
## Oxsat+         expand = 0.5, ticktype = "detailed",
## Oxsat+         clab = "%", main = "Oxygen saturation", 
## Oxsat+         xlab = "longitude", ylab = "latitude", zlab = "depth")

## 
## Oxsat> # restore plotting parameters
## Oxsat>  par(mfrow = pm)