[R-sig-eco] ordiplot questions

Gavin Simpson gavin.simpson at ucl.ac.uk
Thu Jul 21 16:53:40 CEST 2011


On Thu, 2011-07-21 at 10:30 -0400, Chris Habeck wrote:
> Hi Gavin,
> 
> 
> Thank you for your valuable help and suggestions.  The problem with
> the tick intervals is now sorted out with the code you provided.
>  Thanks!
> 
> 
> Also, the code you provided for plotting vector arrows without the
> labels is much appreciated, but I have run into one hiccup in this
> regard:  the arrow lengths are uniform, rather than being scaled by
> the correlation.  Can this problem be overcome?  This time, I have
> provided the data and code as attachments   Hopefully, they pass the
> posting filter!

Yes, apologies; I missed a vital line from the plot.envfit code, that
does the scaling:

ends <- sqrt(vf$vectors$r) * vf$vectors$arrows
ends <- ends * ordiArrowMul(ends, c(0,0))
arrows(0, 0, ends[1], ends[2], length = 0.1, col = "blue")

We could allow suppression/specification (rather than the variable
names, user supplied labels) of the arrow labels at run-time via an
argument in plot.envfit - which I'll take a look at, plus suppression of
axis plotting in ordiplot() would be useful...

The full example then is:

data(dune)
library(MASS) ## isoMDS
sol <- metaMDS(dune)
ordiplot(sol, type="t", display = "sites", ylim = c(-0.7,0.7),
         xlim = c(-0.7,0.7), xaxt = "n", yaxt = "n", bty = "n")
locs <- zapsmall(seq(-0.7, 0.7, by = 0.1))
axis(side = 1, at = locs)
axis(side = 2, at = locs)
box()
data(dune.env)
vf <- envfit(sol ~ A1, data = dune.env)
ends <- sqrt(vf$vectors$r) * vf$vectors$arrows
ends <- ends * ordiArrowMul(ends, c(0,0))
arrows(0, 0, ends[1], ends[2], length = 0.1, col = "blue")

HTH

G

> 
> Best,
> 
> 
> Chris
> ****************************************
> Chris Habeck
> Remnant Expansion Project
> Postdoctoral Research Associate
> Department of Biology
> Washington University at St. Louis
> 
> 
> 
> 
> On Thu, Jul 21, 2011 at 5:01 AM, Gavin Simpson
> <gavin.simpson at ucl.ac.uk> wrote:
>         On Wed, 2011-07-20 at 20:54 -0400, Chris Habeck wrote:
>         > Hi,
>         >
>         > I have two questions regarding the use of ordiplot{vegan}
>         and envfit{vegan}.
>         >  Hopefully someone can help.
>         
>         
>         Your 1st question isn't very clear, perhaps because the
>         example you give
>         is not reproducible and the figure you attached hasn't made it
>         through
>         the mailing list filters.
>         
>         > First question:  I am trying to maximize the space used to
>         project my sites
>         > onto a graph of NMDS results by defining the xlim and ylim,
>         but the axes
>         > default to separate tick intervals (see attached figure).
>          How do I get the
>         > intervals to behave?
>         
>         
>         What do you mean by "behave"? ylim and xlim do not set the
>         tick
>         intervals, they just set the limits of the plotting region
>         (well almost,
>         R adds a small fudge amount of 4% IIRC and then finds pretty
>         tick
>         locations within the range) in data coordinates. If you mean
>         that the
>         tick interval on both axes is different, as in:
>         
>         ## from ?metaMDS
>         data(dune)
>         library(MASS) ## isoMDS
>         sol <- metaMDS(dune)
>         ordiplot(sol, type="t", display = "sites", ylim = c(-0.7,0.7),
>                 xlim = c(-0.7,0.7))
>         
>         then you need make the plotting region square - the axes are
>         in the same
>         unit scale so it is the relative length of the axes on the
>         display that
>         is determining the placement of ticks.
>         
>         Alternatively suppress the axes and draw the axes with ticks
>         where you
>         want them:
>         
>         ordiplot(sol, type="t", display = "sites", ylim = c(-0.7,0.7),
>                 xlim = c(-0.7,0.7), xaxt = "n", yaxt = "n", bty = "n")
>         locs <- zapsmall(seq(-0.7, 0.7, by = 0.1))
>         axis(side = 1, at = locs)
>         axis(side = 2, at = locs)
>         box()
>         
>         Automated plotting makes a number of assumptions about what
>         the user
>         wants. If those aren't what is really desired then one must
>         get ones
>         hands dirty and build the plot up themselves using standard R
>         plotting
>         functions.
>         
>         > Second question:  I would like to display the vector lines
>         from my envfit
>         > object, but not the variable labels.  Is this possible?
>         
>         
>         Yes, same advice as above, draw them yourself:
>         
>         ## continuing from above
>         data(dune.env)
>         vf <- envfit(sol ~ A1, data = dune.env)
>         
>         The end-points of the arrows are stored in $vectors$arrows of
>         the
>         returned object, so we can use the standard R function
>         `arrows()` to
>         plot them:
>         
>         ends <- vf$vectors$arrows
>         ends <- ends * ordiArrowMul(ends, c(0,0))
>         arrows(0, 0, ends[1], ends[2], length = 0.1, col = "blue")
>         
>         I use the helper function ordiArrowMul() to work out the
>         correct
>         multiplier to scale the unit length arrow appropriately for
>         the plot.
>         
>         > Below is the associated code used to produce the attached
>         figure.
>         >
>         > library(vegan)
>         > rem.mds = metaMDS(rem.spp)
>         > rem.ef <- envfit(rem.mds,
>         > rem.env[,c(2,3,4,5,7,8,10:12,15:18,20,21,22,24,28)],na.rm =
>         TRUE, permu =
>         > 999)
>         > rem.ef
>         
>         
>         Not reproducible as we don't have your data. Try to supply a
>         proper
>         reproducible example in the future by giving us your data, or,
>         *better*
>         do as I did and take one of the provided example data sets and
>         base your
>         example on that.
>         
>         HTH
>         
>         G
>         
>         >
>         > rem.plot = ordiplot(rem.mds, type = "none", display =
>         "sites", xlim =
>         > c(-0.7,0.7), ylim = c(-0.7,0.7))
>         > points(rem.plot, "sites", pch=21, cex = 2, col="black",
>         bg="white")
>         > plot(rem.ef, p.max = 0.05, col = "red", cex = 1.2)
>         >
>         >
>         >
>         > ****************************************
>         > Chris Habeck
>         > Remnant Expansion Project
>         > Postdoctoral Research Associate
>         > Department of Biology
>         > Washington University at St. Louis
>         
>         > _______________________________________________
>         > R-sig-ecology mailing list
>         > R-sig-ecology at r-project.org
>         > https://stat.ethz.ch/mailman/listinfo/r-sig-ecology
>         
>         --
>         %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~
>         %~%~%~%
>          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
>         %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~
>         %~%~%~%
>         
> 
> 

-- 
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
 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-sig-ecology mailing list