[R] reflecting a PCA biplot
Gavin Simpson
gavin.simpson at ucl.ac.uk
Wed Aug 10 14:08:46 CEST 2011
On Tue, 2011-08-09 at 22:57 +1000, Andrew Halford wrote:
> Hi Listers,
>
> I am trying to reflect a PCA biplot in the x-axis (i.e. PC1) but am not
> having much success. In theory I believe all I need to do is multiply the
> site and species scores for the PC1 by -1, which would effectively flip the
> biplot.
>
> I am creating a blank plot using the plot command and accessing the results
> from a call to rda. I then use the calls to scores to obtain separate site
> and species coordinates and I have worked out how to multiply the
> appropriate PC1 scores by -1 to create the site and species scores I want.
> However I am not sure how to change the call to plot which accesses the
> results of the call to rda to draw the blank plot. The coordinates it is
> accessing are for the unreflected ordination and this does not match the new
> site and species scores that I have.
>
>
> > fish.pca <- rda(fish.hel)
> > fish.site <- scores(fish.pca,display="sites",scaling=3)
> > fish.spp <- scores(fish.pca,display="species",scaling=3)
>
> > fish.site[,"PC1"] <- -1*(fish.site[,"PC1"])
> > fish.spp[,"PC1"] <- -1*(fish.spp[,"PC1"])
>
> > graph <- plot(fish.pca,display=c("sites","species"),type="n",scaling=3) #
> how do I get the plot to draw up the blank display based on the reversed
> site and species scores?
Do you mean something like...?
require(vegan)
data(dune)
mod <- rda(dune)
si.scrs <- scores(mod, display = "sites", scaling = 3, choices = 1:2)
sp.scrs <- scores(mod, display = "species", scaling = 3, choices = 1:2)
si.scrs[, "PC1"] <- -1 * si.scrs[, "PC1"]
sp.scrs[, "PC1"] <- -1 * sp.scrs[, "PC1"]
xlim <- range(0, si.scrs[, 1], sp.scrs[, 1])
ylim <- range(0, si.scrs[, 2], sp.scrs[, 2])
plot(si.scrs[,1], si.scrs[,2], ylim = ylim, xlim = xlim,
ylab = "PC2", xlab = "PC1", cex = 0.7, asp = 1)
abline(h = 0, lty = "dotted")
abline(v = 0, lty = "dotted")
points(sp.scrs[,1], sp.scrs[,2], col = "red", pch = 3, cex = 0.7)
box()
For non-standard plotting of ordination objects, our advice has always
been to build the plot up from lower-level plotting functions rather
than the specific methods supplied with vegan.
A comparison: (not quite the same, I know, but close enough)
layout(matrix(1:2, ncol = 2))
plot(mod, display=c("sites","species"), type = "p", scaling=3,
main = "Original")
plot(si.scrs[,1], si.scrs[,2], ylim = ylim, xlim = xlim,
ylab = "PC2", xlab = "PC1", cex = 0.7, asp = 1,
main = "Flipped PC1")
abline(h = 0, lty = "dotted")
abline(v = 0, lty = "dotted")
points(sp.scrs[,1], sp.scrs[,2], col = "red", pch = 3, cex = 0.7)
box()
layout(1)
If you want type = "t", the default for plot.cca, then use the same
coordinates but extract the relevant labels from the two scores objects:
plot(si.scrs[,1], si.scrs[,2], ylim = ylim, xlim = xlim,
ylab = "PC2", xlab = "PC1", cex = 0.7, asp = 1,
type = "n") ## no plotting this time first
abline(h = 0, lty = "dotted")
abline(v = 0, lty = "dotted")
text(si.scrs[,1], si.scrs[,2], labels = rownames(si.scrs),
cex = 0.7) ## add site and species scores as labels
text(sp.scrs[,1], sp.scrs[,2], labels = rownames(sp.scrs),
col = "red", cex = 0.7)
box()
HTH
G
> Any help appreciated.
>
> cheers
>
> Andy
--
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
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
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
More information about the R-help
mailing list