Quantcast

Different labels for subsets of points in a PCA or RDA biplot

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Different labels for subsets of points in a PCA or RDA biplot

Dave Hewitt
I've tried a few things both with prcomp(), and rda() and its friends
in vegan (including biplot.rda and ordiplot), but can't find a
solution. I'd like to associate subsets of the points in a resulting
biplot ("sites" in the rda object) with different plotting colors/text
styles to emphasize certain sets of points. I can't figure out how to
keep the arrows (for "species" in the rda object) and then pass sets
of points and their labels separately. A subproblem is finding out how
to associate a vector of text labels with the coordinates in the rda
object. I had no problem doing this with 'xlabs' in biplot.prcomp(),
but can't get 'labels' to recognize such in ordiplot functions.

--
Dave Hewitt

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Different labels for subsets of points in a PCA or RDA biplot

Gavin Simpson
On Thu, 2009-02-12 at 09:42 -0800, David Hewitt wrote:

> I've tried a few things both with prcomp(), and rda() and its friends
> in vegan (including biplot.rda and ordiplot), but can't find a
> solution. I'd like to associate subsets of the points in a resulting
> biplot ("sites" in the rda object) with different plotting colors/text
> styles to emphasize certain sets of points. I can't figure out how to
> keep the arrows (for "species" in the rda object) and then pass sets
> of points and their labels separately. A subproblem is finding out how
> to associate a vector of text labels with the coordinates in the rda
> object. I had no problem doing this with 'xlabs' in biplot.prcomp(),
> but can't get 'labels' to recognize such in ordiplot functions.

hi David,

Currently most of vegan's plotting functions don't recognise vector
arguments for colours/symbols etc. This is something I have been meaning
to set aside time for but other work has taken precedence lately.

Vegan does however provide you with all the tools to do this yourself.

I'm about to head out of the office, but the general idea would be:

## continue example from ?biplot.rda
## produces 'mod'
example(biplot.rda)
## grab the scores on axes you require; mod == your fitted rda/pca
site.scr <- scores(mod, display = "sites", scaling = 3)
spp.scr <- scores(mod, display = "species", scaling = 3)

## generate x,y lims
xlims <- range(site.scr[,1], spp.scr[,1])
ylims <- range(site.scr[,2], spp.scr[,2])

## plot what you want, but leave out sites
biplot(mod, display = "species", xlim = xlims, ylim = ylims,
       scaling = 3)

## now add in scores as you want, to simulate we plot:
## rows 1:10 of dune in red, and
## rows 11:20 in blue.
points(site.scr[1:10,], col = "red", pch = 2)
points(site.scr[11:20,], col = "blue", pch = 3)

The coordinates you are looking for are the things returned by scores()
(with the relevant scaling applied). There is no argument 'labels' to
ordiplot however, so perhaps you could provide an example of what you
are doing as per the posting guide and I will try to help you.

HTH

G

--
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
 Dr. Gavin Simpson             [t] +44 (0)20 7679 0522
 ECRC, UCL Geography,          [f] +44 (0)20 7679 0565
 Pearson Building,             [e] gavin.simpsonATNOSPAMucl.ac.uk
 Gower Street, London          [w] http://www.ucl.ac.uk/~ucfagls/
 UK. WC1E 6BT.                 [w] http://www.freshwaters.org.uk
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Different labels for subsets of points in a PCA or RDA biplot

Dave Hewitt
Thanks Gavin. Your advice and a little digging got me what I needed.
Sorry for not specifying the correct function RE: 'labels' -- I was
referring to text() as described in the ordiplot help page.

Anyway, here's a code example of what I wanted to do. Probably not the
most elegant solution, but it works.

##################
library(vegan)

junk <-
structure(list(IDer=structure(1:26, .Label=c("A", "B", "C",
   "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
   "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y",
   "Z"), class="factor"), AA=c(1.2, 0.8, 2.1, 1.1, 1.2,
   1.1, 1.6, 1.8, 1.5, 1, 2.3, 1.2, 1.5, 2.7, 1.2, 1.9,
   0.7, 1.8, 1.4, 0.5, 3.3, 1.6, 2.2, 2.5, 1.1, 1.6),
   BB=c(0.0031, 0.0058, 0.0281, 0.006, 0.0023, 0.0081,
   0.011, 0.0185, 0.0029, 0.0019, 0.0059, 0.0101, 0.0064,
   0.0254, 0.0304, 0.0115, 0.0032, 0.0211, 0.0222, 0.0016,
   0.0471, 0.0088, 0.0267, 0.0707, 0.0043, 0.0044),
   CC=c(368693L, 80008L, 33980L, 22446L, 277207L, 291783L,
   66376L, 137225L, 25908L, 547213L, 172857L, 219773L,
   10779L, 173601L, 324056L, 78370L, 295640L, 236235L,
   146339L, 77554L, 8019L, 143727L, 253631L, 112779L,
   9976L, 442107L),
   DD=c(3.1, 1.1, 0.6, 0.3, 3.1, 4, 0.9, 1.8, 0.4, 5, 3.3,
   2.5, 0.2, 3.4, 3.8, 1.1, 2.5, 3.4, 2.1, 0.4, 0.2, 2.3,
   4.1, 2.1, 0.1, 3.6)),
   .Names=c("IDer", "AA", "BB", "CC", "DD"),
   class="data.frame", row.names=c(NA, -26L))

ord <- rda(junk[, 2:5], scale=TRUE)

# Grab the scores on the first two axes
items.scr <- scores(ord, display="sites", scaling=3)
vars.scr <- scores(ord, display="species", scaling=3)

# Associate the item scores with their labels
row.names(items.scr) <- junk$IDer

# Make a subset variable for 2 special groups of items
junk$awesome <- rep(0, 26)
awesomelist1 <- c("A", "J", "K", "L", "S", "U", "Z")
awesomelist2 <- c("B", "C", "V", "W", "X", "Y")
junk$awesome[junk$IDer %in% awesomelist1] <- 1
junk$awesome[junk$IDer %in% awesomelist2] <- 2

# Set x,y limits
xlims <- c(-1.7, 1.4)
ylims <- c(-0.4, 1.3)

# Plot without points
oldpar <- par(mar=c(4, 4, 1, 1))
biplot.rda(ord, scaling=3, display="species", type="text",
   col="lightblue", xlim=xlims, ylim=ylims)

# Add labels for the 3 subsets
text(items.scr[junk$awesome==0, ],
   labels=row.names(items.scr[junk$awesome==0, ]),
   col="lightgray")
text(items.scr[junk$awesome==1, ],
   labels=row.names(items.scr[junk$awesome==1, ]),
   col="black")
   text(items.scr[junk$awesome==2, ],
   labels=row.names(items.scr[junk$awesome==2, ]),
   col="darkblue", cex=1.3)
par(oldpar)


>> On Thu, 2009-02-12 at 09:42 -0800, David Hewitt wrote:
>> I've tried a few things both with prcomp(), and rda() and
>> its friends in vegan (including biplot.rda and ordiplot),
>> but can't find a solution. I'd like to associate subsets of
>> the points in a resulting biplot ("sites" in the rda object)
>> with different plotting colors/text styles to emphasize
>> certain sets of points. I can't figure out how to
>> keep the arrows (for "species" in the rda object) and
>> then pass sets of points and their labels separately.
>> A subproblem is finding out how to associate a vector
>> of text labels with the coordinates in the rda object.
>> I had no problem doing this with 'xlabs' in biplot.prcomp(),
>> but can't get 'labels' to recognize such in ordiplot functions.
>>
> On Thu, Feb 12, 2009 at 10:28 AM, Gavin Simpson
> <[hidden email]> wrote:
> hi David,
>
> Currently most of vegan's plotting functions don't
> recognise vector arguments for colours/symbols etc.
> This is something I have been meaning to set aside
> time for but other work has taken precedence lately.
>
> Vegan does however provide you with all the tools to do
> this yourself. I'm about to head out of the office, but the
> general idea would be:
>
> ## continue example from ?biplot.rda
> ## produces 'mod'
> example(biplot.rda)
> ## grab the scores on axes you require;
> mod == your fitted rda/pca
> site.scr <- scores(mod, display = "sites", scaling = 3)
> spp.scr <- scores(mod, display = "species", scaling = 3)
>
> ## generate x,y lims
> xlims <- range(site.scr[,1], spp.scr[,1])
> ylims <- range(site.scr[,2], spp.scr[,2])
>
> ## plot what you want, but leave out sites
> biplot(mod, display = "species", xlim = xlims, ylim = ylims,
>       scaling = 3)
>
> ## now add in scores as you want, to simulate we plot:
> ## rows 1:10 of dune in red, and
> ## rows 11:20 in blue.
> points(site.scr[1:10,], col = "red", pch = 2)
> points(site.scr[11:20,], col = "blue", pch = 3)
>
> The coordinates you are looking for are the things
> returned by scores() (with the relevant scaling applied).
> There is no argument 'labels' to ordiplot however, so
> perhaps you could provide an example of what you
> are doing as per the posting guide and I will try to help you.

______________________________________________
[hidden email] 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.
Loading...