Re: [R] Tutorial on rgl Graphics

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Fri, 25 Jul 2008 11:33:23 -0400

On 7/25/2008 11:01 AM, Tom La Bone wrote:
> After looking around a bit more I found the example I was looking for --
> plotlm3d, which I found on the R wiki
>
> http://wiki.r-project.org/rwiki/doku.php?id=graph_gallery:new-graphics
>
> The original author was John Fox, and it was modified by Jose Claudio Faria
> and Duncan Murdoch. Below is a simplified version of the function and two
> examples. One example was presented as a test of the function and it works
> fine. The second example is the plot I want to make and I can't seem to get
> the scale on the x and y axes correct. Being unfamiliar with rgl, can
> someone provide a hint on how to get the scales right? Thanks for the help.
>
> Tom
>
>
>
> plotlm3d <- function (x, y, z,
> surface = T,
> model = 'z ~ x + y',
> simple.axes = T,
> box = F,
> xlab = deparse(substitute(x)),
> ylab = deparse(substitute(y)),
> zlab = deparse(substitute(z)),
> surface.col = c('blue', 'orange', 'red', 'green',
> 'magenta', 'cyan', 'yellow',
> 'gray', 'brown'),
> point.col = 'yellow',
> grid.col = material3d("color"),
> grid = T,
> grid.lines = 26,
> sphere.factor = 1,
> threshold = 0.01)
> {
> require(rgl)
> require(mgcv)
> xlab; ylab; zlab
> size <- max(c(x,y,z))/100 * sphere.factor
> if (size > threshold)
> spheres3d(x, y, z, color = point.col, radius = size)
> else
> points3d(x, y, z, color = point.col)
> aspect3d(c(1, 1, 1))
> if (surface) {
> xvals <- seq(min(x), max(x), length = grid.lines)
> yvals <- seq(min(y), max(y), length = grid.lines)
> dat <- expand.grid(x = xvals, y = yvals)
> for (i in 1:length(model)) {
> mod <- lm(formula(model[i]))
> zhat <- matrix(predict(mod, newdata = dat), grid.lines, grid.lines)
> surface3d(xvals, yvals, zhat, color = surface.col[i], alpha = 0.5, lit
> = F)
> if (grid)
> surface3d(xvals, yvals, zhat, color = grid.col, alpha = 0.5,
> lit = F, front = 'lines', back = 'lines') }}
> if(simple.axes) {
> axes3d(c('x', 'y', 'z'))
> title3d(xlab = xlab, ylab = ylab, zlab = zlab)
> }
> else
> decorate3d(xlab = xlab, ylab = ylab, zlab = zlab, box = box)
> }
>
> #This is an example of a 3D scatterplot that works fine
> x <- c( 274, 180, 375, 205, 86, 265, 98, 330, 195, 53,
> 430, 372, 236, 157, 370)
> y <- c(2450, 3254, 3802, 2838, 2347, 3782, 3008, 2450, 2137, 2560,
> 4020, 4427, 2660, 2088, 2605)
> z <- c( 162, 120, 223, 131, 67, 169, 81, 192, 116, 55,
> 252, 232, 144, 103, 212)
> open3d()
> plotlm3d(x, y, z,
> surface = T,
> model = 'z ~ x + y',
> xlab = 'x',
> ylab = 'y',
> zlab = 'z')
>
> #This is the plot I am trying to make - scales on x and y axes are wrong
> x <- c(0.3405,0.1220,0.1028,0.08451,0.05668,0.0345,0.003788,0.002121)
> y <- c(0.3460,0.1227,0.1097,0.09666,0.07677,0.06278,0.02168,0.01303)
> z <- c(2720,1150,1010,790,482,358,78,35)
> open3d()
> plotlm3d(x, y, z,
> surface = T,
> model = 'z ~ x + y - 1',
> xlab = 'x',
> ylab = 'y',
> zlab = 'z')

I think you're seeing the effect of the inaccurate bounding box calculation described in ?spheres3d. The problem is that you're asking for a sphere, but your axes are on wildly different scales. The bounding box calculation for that situation fails.

You can work around this by telling rgl to ignore the extent of the spheres (via par3d(ignoreExtent=TRUE)), and plot some points in the corners of the bounding box you really want. Set their alpha to 0 and they'll be invisible.

Some day I'll probably fix this, but it's likely to be a while.

Duncan Murdoch



R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Fri 25 Jul 2008 - 15:38:19 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 25 Jul 2008 - 17:32:34 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive