[R] lattice: cloud: aspect ratio, labels, vertical lines

Deepayan Sarkar deepayan at stat.wisc.edu
Thu Jan 16 00:04:02 CET 2003


On Wednesday 15 January 2003 05:15 am, Wolfram Fischer wrote:
> I am interested to know how to make for clouds:
> - aspect ratio = 1
> - labels attached to points
> - vertical lines from the points to the x/y base plane
>
> I tried:
>     t = c( 'A', 'B', 'C', 'D' )
>     x = c( 100,   0, 200, 100 )
>     y = c(   0, 100,   0, 100 )
>     z = c(  80,   0,  20,  40 )
>
>     q = data.frame( x, y, z )
>     rownames( q ) = t
>
>     print(cloud( z ~ x * y, data = q, type = c( 'p', 'h' )
>         , scales = list( arrows=FALSE )
>         , aspect = c( max(y)/max(x), max(z)/max(x) )
>     ))
>
>
> My questions:
> - Is there an easier way to tell that aspect ratio should be 1
>   on all dimensions, especially without the precalculations
>   of max(...)?

You mean that the aspect ratio should be 1 on the data scale ? This is not 
currently possible, but I have plans to add this, among other things, in the 
next major release.

> - "type = 'h'" does not work as I expected. What to do?

This is partially implemented, but not the default yet (and not widely 
advertised). Try 

print(cloud( z ~ x * y, data = q, type = 'h'
      , panel.3d.cloud = panel.3dscatter.new,
      , scales = list( arrows=FALSE )
      , aspect = c( max(y)/max(x), max(z)/max(x) )
   ))

type cannot be a vector, but that's not a major problem (see below).

> - How can I get the labels of t into the graphic?

Something like:


panel.custom <-
    function(x, y, z, groups, subscripts,
             rot.mat = diag(4), za, zb, zback, zfront, distance, ...)
{
    panel.3dscatter.new(x, y, z, type = 'h',
                        rot.mat = rot.mat, za = za, zb = zb,
                        zback = zback, zfront = zfront,
                        distance = distance, ...)
    m <- ltransform3dto3d(rbind(x, y, z), rot.mat, za, zb, 
                          zback, zfront, distance)
    ltext(x = m[1,], y = m[2,], lab = groups[subscripts])
}


print(cloud( z ~ x * y, data = q, groups = rownames(q),
            xlim = c(-10, 210), ylim = c(-5, 105),
            panel.3d.cloud = panel.custom,
            scales = list( arrows=FALSE ),
            aspect = c( max(y)/max(x), max(z)/max(x) )
            ))

The point being that the ltransform3dto3d() function makes the projection 
easily enough for normal users to use it inside a custom panel.3d.cloud 
function.

Deepayan




More information about the R-help mailing list