[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

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

```