3-D volume visualisation | R Documentation |
slice3D
plots a 3-D dataset with a color variable as slices or on surfaces.
slicecont3D
plots a 3-D dataset with a color variable as contours on slices.
isosurf3D
plots isosurfaces from a 3-D dataset.
voxel3D
plots isosurfaces as scatterpoints.
createisosurf
create the isosurfaces (triangulations)
from volumetric data. Its output can be plotted with triangle3D
.
createvoxel
creates voxels (x, y, z) points from volumetric data.
Its output can be plotted with scatter3D.
slice3D (x, y, z, colvar, ..., phi = 40, theta = 40,
xs = min(x), ys = max(y), zs = min(z),
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE, colkey = NULL,
panel.first = NULL, clim = NULL,
clab = NULL, bty = "b",
lighting = FALSE, shade = NA, ltheta = -135, lphi = 0,
add = FALSE, plot = TRUE)
slicecont3D (x, y, z, colvar, ..., phi = 40, theta = 40,
xs = NULL, ys = NULL, zs = NULL, level = NULL,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE,
colkey = NULL, panel.first = NULL,
clim = NULL, clab = NULL, bty = "b",
dDepth = 0, add = FALSE, plot = TRUE)
isosurf3D (x, y, z, colvar, ..., phi = 40, theta = 40,
level = mean(colvar, na.rm = TRUE), isofunc = createisosurf,
col = NULL, border = NA, facets = TRUE,
colkey = NULL, panel.first = NULL,
clab = NULL, bty = "b",
lighting = FALSE, shade = 0.5, ltheta = -135, lphi = 0,
add = FALSE, plot = TRUE)
voxel3D (x, y, z, colvar, ..., phi = 40, theta = 40,
level = mean(colvar, na.rm = TRUE), eps = 0.01, operator = "=",
col = NULL, NAcol = "white", breaks = NULL, colkey = FALSE,
panel.first = NULL, bty = "b", add = FALSE, plot = TRUE)
triangle3D (tri, colvar = NULL, ..., phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
border = NA, facets = TRUE,
colkey = NULL, panel.first = NULL,
lighting = FALSE, shade = 0.5, ltheta = -135, lphi = 0,
clim = NULL, clab = NULL,
bty = "b", add = FALSE, plot = TRUE)
createisosurf (x, y, z, colvar, level = mean(colvar, na.rm = TRUE))
createvoxel (x, y, z, colvar, level = mean(colvar, na.rm = TRUE), eps = 0.01,
operator = "=")
x , y , z |
Vectors with x, y and z-values.
They should be of length equal to the first, second and
third dimension of |
colvar |
The variable used for coloring.
It should be an array of dimension equal to
|
tri |
A three-columned matrix (x, y, z) with triangle coordinates. A triangle is defined by three consecutive rows. |
isofunc |
A function defined as |
theta , phi |
the angles defining the viewing direction.
|
col |
Colors to be used for coloring the |
NAcol |
Colors to be used for |
breaks |
a set of finite numeric breakpoints for the colors; must have one more breakpoint than color and be in increasing order. Unsorted vectors will be sorted, with a warning. |
border |
The color of the lines drawn around the surface facets.
The default, |
facets |
If |
colkey |
A logical, The default is to draw the color key on side = 4, i.e. in the right margin.
If |
panel.first |
A |
clab |
Only if |
clim |
Only if |
xs , ys , zs |
Vectors or matrices.
Vectors specify the positions in x, y or z where the slices (planes) are to be drawn.
The values of |
level |
The level(s) at which the There can be more than one level, but for |
lighting |
If not Will overrule See examples in jet.col. |
shade |
the degree of shading of the surface facets. 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. See persp. |
ltheta , lphi |
if finite values are specified for |
bty |
The type of the box, the default only draws background panels.
Only effective if the persp
argument ( |
eps |
The voxel precision, only used when |
operator |
One of '=', '<', '>', '<>' for selection of points ‘equal’ (within precision), larger or smaller than the required level or to be within an interval. |
dDepth |
When a contour is added on an image, the image polygons may
hide some contour segments. To avoid that, the viewing depth of the segments
can be artificially decreased with the factor |
add |
Logical. If |
plot |
Logical. If |
... |
additional arguments passed to the plotting methods. The following persp arguments can be specified:
In addition, the perspbox arguments
For all functions, the arguments The arguments after ... must be matched exactly. |
The plotting functions return the viewing transformation matrix, See trans3D.
Function createisosurf
returns a three-columned matrix (x, y, z) with
triangle coordinates. One triangle is defined by three consecutive rows.
It can be plotted with triangle3D
.
Function createvoxel
returns a list with the elements x, y, z
defining the points that are at a distance of less than
eps*diff(range(colvar))
from the required level
.
Its output can be plotted with scatter3D.
The isosurf3D
function uses function computeContour3d
,
from package misc3d
, which is based on the marching cubes algorithm.
Please cite the package misc3d
(Feng & Tierney, 2008) when using isosurf3D
.
For voxel3D
, coloring is always according to the z-variable. A more flexible
coloration can be achieved by using createvoxel
, followed by scatter3D.
See examples.
Karline Soetaert <karline.soetaert@nioz.nl>
Lorensen, W.E. and Cline, H.E., Marching Cubes: a high resolution 3D surface reconstruction algorithm, Computer Graphics, Vol. 21, No. 4, pp 163-169 (Proc. of SIGGRAPH), 1987.
Dai Feng, Luke Tierney, Computing and Displaying Isosurfaces in R, Journal of Statistical Software 28(1), 2008. URL https://www.jstatsoft.org/v28/i01/.
Oxsat for another example of slice3D
.
plotdev for zooming, rescaling, rotating a plot.
# save plotting parameters
pm <- par("mfrow")
pmar <- par("mar")
## =======================================================================
## Simple slice3D examples
## =======================================================================
par(mfrow = c(2, 2))
x <- y <- z <- seq(-1, 1, by = 0.1)
grid <- mesh(x, y, z)
colvar <- with(grid, x*exp(-x^2 - y^2 - z^2))
# default is just the panels
slice3D (x, y, z, colvar = colvar, theta = 60)
# contour slices
slicecont3D (x, y, z, ys = seq(-1, 1, by = 0.5), colvar = colvar,
theta = 60, border = "black")
slice3D (x, y, z, xs = c(-1, -0.5, 0.5), ys = c(-1, 0, 1),
zs = c(-1, 0), colvar = colvar,
theta = 60, phi = 40)
## =======================================================================
## coloring on a surface
## =======================================================================
XY <- mesh(x, y)
ZZ <- XY$x*XY$y
slice3D (x, y, z, xs = XY$x, ys = XY$y, zs = ZZ, colvar = colvar,
lighting = TRUE, lphi = 90, ltheta = 0)
## =======================================================================
## Specifying transparent colors
## =======================================================================
par(mfrow = c(1, 1))
x <- y <- z <- seq(-4, 4, by = 0.2)
M <- mesh(x, y, z)
R <- with (M, sqrt(x^2 + y^2 + z^2))
p <- sin(2*R) /(R+1e-3)
## Not run:
# This is very slow - alpha = 0.5 makes it transparent
slice3D(x, y, z, colvar = p, col = jet.col(alpha = 0.5),
xs = 0, ys = c(-4, 0, 4), zs = NULL, d = 2)
## End(Not run)
slice3D(x, y, z, colvar = p, d = 2, theta = 60, border = "black",
xs = c(-4, 0), ys = c(-4, 0, 4), zs = c(-4, 0))
## =======================================================================
## A section along a transect
## =======================================================================
data(Oxsat)
Ox <- Oxsat$val[, Oxsat$lat > - 5 & Oxsat$lat < 5, ]
slice3D(x = Oxsat$lon, z = -Oxsat$depth, y = 1:5, colvar = Ox,
ys = 1:5, zs = NULL, NAcol = "black",
expand = 0.4, theta = 45, phi = 45)
## =======================================================================
## isosurf3D example - rather slow
## =======================================================================
par(mfrow = c(2, 2), mar = c(2, 2, 2, 2))
x <- y <- z <- seq(-2, 2, length.out = 15)
xyz <- mesh(x, y, z)
F <- with(xyz, log(x^2 + y^2 + z^2 +
10*(x^2 + y^2) * (y^2 + z^2) ^2))
# use shading for level = 1 - show triangulation with border
isosurf3D(x, y, z, F, level = 1, shade = 0.9,
col = "yellow", border = "orange")
# lighting for level - 2
isosurf3D(x, y, z, F, level = 2, lighting = TRUE,
lphi = 0, ltheta = 0, col = "blue", shade = NA)
# three levels, transparency added
isosurf3D(x, y, z, F, level = seq(0, 4, by = 2),
col = c("red", "blue", "yellow"),
clab = "F", alpha = 0.2, theta = 0, lighting = TRUE)
# transparency can also be added afterwards with plotdev()
## Not run:
isosurf3D(x, y, z, F, level = seq(0, 4, by = 2),
col = c("red", "blue", "yellow"),
shade = NA, plot = FALSE, clab = "F")
plotdev(lighting = TRUE, alpha = 0.2, theta = 0)
## End(Not run)
# use of creatisosurf
iso <- createisosurf(x, y, z, F, level = 2)
head(iso)
triangle3D(iso, col = "green", shade = 0.3)
## Not run:
# higher resolution
x <- y <- z <- seq(-2, 2, length.out = 50)
xyz <- mesh(x, y, z)
F <- with(xyz, log(x^2 + y^2 + z^2 +
10*(x^2 + y^2) * (y^2 + z^2) ^2))
# three levels
isosurf3D(x, y, z, F, level = seq(0, 4, by = 2),
col = c("red", "blue", "yellow"),
shade = NA, plot = FALSE, clab = "F")
plotdev(lighting = TRUE, alpha = 0.2, theta = 0)
## End(Not run)
## =======================================================================
## voxel3D example
## =======================================================================
par(mfrow = c(2, 2), mar = c(2, 2, 2, 2))
# fast but needs high resolution grid
x <- y <- z <- seq(-2, 2, length.out = 70)
xyz <- mesh(x, y, z)
F <- with(xyz, log(x^2 + y^2 + z^2 +
10*(x^2 + y^2) * (y^2 + z^2) ^2))
voxel3D(x, y, z, F, level = 4, pch = ".", cex = 5)
## =======================================================================
## rotation
## =======================================================================
plotdev(theta = 45, phi = 0)
plotdev(theta = 90, phi = 10)
# same using createvoxel - more flexible for coloring
vox <- createvoxel(x, y, z, F, level = 4)
scatter3D(vox$x, vox$y, vox$z, colvar = vox$y,
bty = "g", colkey = FALSE)
## =======================================================================
## voxel3D to show hypox sites
## =======================================================================
par(mfrow = c(1, 1), mar = c(2, 2, 2, 2))
Hypox <- createvoxel(Oxsat$lon, Oxsat$lat, Oxsat$depth[1:19],
Oxsat$val[,,1:19], level = 40, operator = "<")
panel <- function(pmat) { # an image at the bottom
Nx <- length(Oxsat$lon)
Ny <- length(Oxsat$lat)
M <- mesh(Oxsat$lon, Oxsat$lat)
xy <- trans3D(pmat = pmat, x = as.vector(M$x), y = as.vector(M$y),
z = rep(-1000, length.out = Nx*Ny))
x <- matrix(nrow = Nx, ncol = Ny, data = xy$x)
y <- matrix(nrow = Nx, ncol = Ny, data = xy$y)
Bat <- Oxsat$val[,,1]; Bat[!is.na(Bat)] <- 1
image2D(x = x, y = y, z = Bat, NAcol = "black", col = "grey",
add = TRUE, colkey = FALSE)
}
scatter3D(Hypox$x, Hypox$y, -Hypox$z, colvar = Hypox$cv,
panel.first = panel, pch = ".", bty = "b",
theta = 30, phi = 20, ticktype = "detailed",
zlim = c(-1000,0), xlim = range(Oxsat$lon),
ylim = range(Oxsat$lat) )
# restore plotting parameters
par(mfrow = pm)
par(mar = pmar)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.