[R] 3d cloud plot with point size reflecting variable value

Deepayan Sarkar deepayan.sarkar at gmail.com
Tue Mar 31 20:49:08 CEST 2009


On Tue, Mar 31, 2009 at 8:57 AM, Dieter Menne
<dieter.menne at menne-biomed.de> wrote:
> R User R User <ruser2008 <at> googlemail.com> writes:
>
>> I'm using the cloud function to plot the iris data as per the document:
>> http://www.stat.ucl.ac.be/ISpersonnel/lecoutre/stats/fichiers/_gallery.pdf
>>
>> I'd like to change the point size to reflect a fourth variable, as done here
>> http://www.cis.hut.fi/projects/somtoolbox/download/pics2/shotvs2_origdata.png
>>
>> Does anybody know how to do this? There doesn't seem to be an option in
>> cloud()
>>
>
> My first idea was to add
>  cex = iris$PetalLength,
>
> which failed, taking the first value of cex only. In panel.3dscatter
> I found the line
>
> cex <- rep(cex, length.out = n)
>
> Which looks like cex is not vectored.

How so? panel.3dscatter() in fact goes to some lengths to be
vectorized: 'n' is the number of points being plotted, and 'cex' is
replicated to be equally long here. This is needed so that the 'cex'
values can later be reordered in the same way as the points being
plotted (by decreasing depth). The following should work:

cloud(Sepal.Length ~ Petal.Length * Petal.Width, data = iris, pch = 1,
cex = with(iris, 3 * Sepal.Width / max(Sepal.Width)))

One caveat is that this will not work in a multi-panel plot. In that
case, a custom panel function will need to create a suitable subset of
'cex' (cex[subscripts]) before calling panel.3dscatter().

-Deepayan


> So my approach would be to make
> a copy of panel.3dscatter and do the correct cex replacement there.
>
> I might be wrong, however, Deepayan has the last say.
>
> Dieter




More information about the R-help mailing list