persp {base} | R Documentation |
This function draws perspective plots of surfaces over the xy plane.
persp(x = seq(0, 1, len = nrow(z)), y = seq(0, 1, len = ncol(z)), z, xlim = range(x), ylim = range(y), zlim = range(z, na.rm = TRUE), xlab = NULL, ylab = NULL, zlab = NULL, theta = 0, phi = 15, r = sqrt(3), d = 1, scale = TRUE, expand = 1, col = NULL, border = NULL, ltheta = -135, lphi = 0, shade = NA, box = TRUE, axes = TRUE, nticks = 5, ticktype = "simple", ...)
x, y |
locations of grid lines at which the values in z are
measured. These must be in ascending order. By default, equally
spaced values from 0 to 1 are used. If x is a list ,
its components x$x and x$y are used for x
and y , respectively. |
z |
a matrix containing the values to be plotted (NA s are
allowed). Note that x can be used instead of z for
convenience. |
xlim, ylim, zlim |
x-, y- and z-limits. The plot is produced so that the rectangular volume defined by these limits is visible. |
xlab, ylab, zlab |
titles for the axes. |
theta, phi |
angles defining the viewing direction.
theta gives the azimuthal direction and phi
the colatitude. |
r |
the distance of the eyepoint from the centre of the plotting box. |
d |
a value which can be used to vary the strength of
the perspective transformation. Values of d greater
than 1 will lessen the perspective effect and values less
and 1 will exaggerate it. |
scale |
before viewing the x, y and z coordinates of the
points defining the surface are transformed to the interval
[0,1]. If scale is TRUE the x, y and z coordinates
are transformed separately. If scale is FALSE
the coordinates are scaled so that aspect ratios are retained.
This is useful for rendering things like DEM information. |
expand |
a expansion factor applied to the z
coordinates. Often used with 0 < expand < 1 to shrink the
plotting box in the z direction. |
col |
the color of the surface facets. |
border |
the color of the line drawn around the surface facets.
A value of NA will disable the drawing of borders. This is
sometimes useful when the surface is shaded. |
ltheta, lphi |
if finite values are specified for ltheta
and lphi , the surface is shaded as though it was being
illuminated from the direction specified by azimuth ltheta
and colatitude lphi . |
shade |
the shade at a surface facet is computed as
((1+d)/2)^shade , where d is the dot product of
a unit vector normal to the facet and a unit vector in the
direction of a light source. Values of shade close
to one yield shading similar to a point light source model
and values close to zero produce no shading. Values in the
range 0.5 to 0.75 provide an approximation to daylight
illumination. |
box |
should the bounding box for the surface be displayed.
The default is TRUE . |
axes |
should ticks and labels be added to the box. The
default is TRUE . If box is FALSE then no
ticks or labels are drawn. |
ticktype |
character: "simple" draws just an arrow parallel to the axis to indicate direction of increase; "detailed" draws normal ticks as per 2D plots. |
nticks |
the (approximate) number of tick marks to draw on the
axes. Has no effect if ticktype is "simple". |
... |
additional graphical parameters (see par )
and the arguments to title may also be supplied. |
The plots are produced by first transforming the
coordinates to the interval [0,1]. The surface is then viewed
by looking at the origin from a direction defined by theta
and phi
. If theta
and phi
are both zero
the viewing direction is directly down the negative y axis.
Changing theta
will vary the azimuth and changing phi
the colatitude.
# (1) The Obligatory Mathematical surface. # Rotated sinc function. x <- seq(-10, 10, length=50) y <- x f <- function(x,y) { r <- sqrt(x^2+y^2) 10 * sin(r)/r } z <- outer(x, y, f) z[is.na(z)] <- 1 par(bg = "white") persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", xlab = "X", ylab = "Y", zlab = "Z") persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", ltheta = 120, shade = 0.75, ticktype = "detailed", xlab = "X", ylab = "Y", zlab = "Z") # (2) Visualizing a simple DEM model data(volcano) z <- 2 * volcano # Exaggerate the relief x <- 10 * (1:nrow(z)) # 10 meter spacing (S to N) y <- 10 * (1:ncol(z)) # 10 meter spacing (E to W) persp(x, y, z, theta = 120, phi = 15, scale = FALSE, axes = FALSE) # (3) Now something more complex # We border the surface, to make it more "slice like" # and color the top and sides of the surface differently. zmin <- min(z) - 20 z <- rbind(zmin, cbind(zmin, z, zmin), zmin) x <- c(min(x) - 1e-10, x, max(x) + 1e-10) y <- c(min(y) - 1e-10, y, max(y) + 1e-10) fill <- matrix("green3", nr = nrow(z)-1, nc = ncol(z)-1) fill[,1] <- "gray" fill[,ncol(fill)] <- "gray" fill[1,] <- "gray" fill[nrow(fill),] <- "gray" par(bg = "lightblue") persp(x, y, z, theta = 120, phi = 15, col = fill, scale = FALSE, axes = FALSE) title(main = "Maunga Whau\nOne of 50 Volcanoes in the Auckland Region.", font.main = 4) par(bg = "slategray") persp(x, y, z, theta = 135, phi = 30, col = fill, scale = FALSE, ltheta = -120, lphi = 15, shade = 0.65, axes = FALSE) persp(x, y, z, theta = 135, phi = 30, col = "green3", scale = FALSE, ltheta = -120, shade = 0.75, border = NA, box = FALSE)