[R-sig-eco] Rarefaction curves in ggplot

Roman Luštrik rom@n@lu@trik @ending from gm@il@com
Mon Dec 17 19:57:33 CET 2018


I don't think it's that critical. It's just a matter of coercing the data
into a long format. And loading the entire tidyverse isn't really necessary
since we need one package from that bundle. I present a bonus feature using
plotly (see at the bottom).

library(vegan)
library(ggplot2)
library(plotly)

data(BCI)
out <- rarecurve(BCI, step = 10, sample = 400, label = FALSE)
names(out) <- paste("species", 1:50, sep = "")

# Coerce data into "long" form.
protox <- mapply(FUN = function(x, y) {
  mydf <- as.data.frame(x)
  colnames(mydf) <- "value"
  mydf$species <- y
  mydf$subsample <- attr(x, "Subsample")
  mydf
}, x = out, y = as.list(names(out)), SIMPLIFY = FALSE)

xy <- do.call(rbind, protox)
rownames(xy) <- NULL  # pretty

# Plot.
ggplot(xy, aes(x = subsample, y = value, color = species)) +
  theme_bw() +
  scale_color_discrete(guide = FALSE) +  # turn legend on or off
  geom_line()

Since exploring this mikado of lines can be hard, we can make the plot
interactive. Try hovering over the lines. Presto!

ggplotly(
  ggplot(xy, aes(x = subsample, y = value, color = species)) +
    theme_bw() +
    theme(legend.position = "none") +  # ggplotly doesn't respect scales?
    geom_line()
)

Cheers,
Roman

On Mon, Dec 17, 2018 at 6:58 PM Drew Tyre <atyre2 using unl.edu> wrote:

> Hi Ellen,
>
> I was curious about this because I will be using a lot of vegan functions
> in a spring class. Turns out not to be trivial - as with all ggplot
> problems the trick is to get the data into a dataframe. I tried several
> things, but ended up writing my own function:
>
> # rarefraction curves and ggplot
> library("tidyverse")
> library("vegan")
> data(BCI)
> out <- rarecurve(BCI, step = 10, sample = 400)
> names(out) <- 1:50
>
> as_tibble_rc <- function(x){
>   # convert rarecurve() output to data.frame
>   # bind_rows doesn't work because items are different lengths
>   # also need to extract sample sizes from attribute
>   # Allocate result dataframe
>   nsamples <- map_int(x, length)
>   total_samples <- sum(nsamples)
>   if(!is.null(names(x))){
>     sites <- names(x)
>   } else {
>     sites <- as.character(1:length(nsamples))
>   }
>   result <- data_frame(Site = rep("", total_samples),
>                        Sample_size = rep(0, total_samples),
>                        Species = rep(0, total_samples))
>   start <- 1
>   for (i in 1:length(nsamples)){
>     result[start:(start + nsamples[i]-1), "Site"] <- sites[i]
>     result[start:(start + nsamples[i]-1), "Sample_size"] <- attr(x[[i]],
> "Subsample")
>     result[start:(start + nsamples[i]-1), "Species"] <- x[[i]]
>     start <- start + nsamples[i]
>   }
>   result
> }
>
> out <- as_tibble_rc(out)
> # add grouping variable
> sitedata <- data_frame(Site = as.character(1:50),
>                        Type = sample(LETTERS[1:2], 50, replace = TRUE))
> alldata <- left_join(out, sitedata, by = "Site")
>
> # and then it's trivial
> ggplot(data = alldata,
>        mapping = aes(x = Sample_size, y = Species, color = Type, group =
> Site)) +
>   geom_line()
>
> hope that helps.
> --
> Drew Tyre
>
> School of Natural Resources
> University of Nebraska-Lincoln
> 416 Hardin Hall, East Campus
> 3310 Holdrege Street
> Lincoln, NE 68583-0974
>
> phone: +1 402 472 4054
> fax: +1 402 472 2946
> email: atyre2 using unl.edu
> http://snr.unl.edu/tyre
> http://drewtyre.rbind.io
>     The point is that our true nature is not some ideal that we have to
> live up to. It’s who we are right now, and that’s what we can make friends
> with and celebrate.
> Excerpted from: Awakening Loving-Kindness by Pema Chödrön
>
>
> On 12/17/18, 10:14 AM, "R-sig-ecology on behalf of Ellen Pape" <
> r-sig-ecology-bounces using r-project.org on behalf of ellen.pape using gmail.com>
> wrote:
>
>     Hi all,
>
>     As I use ggplot2 for all my graphs, I would like to use ggplot2 to
>     construct rarefaction curves as well (I also want to combine 2
> rarefaction
>     curves in 1 plot using cowplot which also vows for using ggplot2).
>
>     I made these rarefaction curves using the rarecurve function in vegan,
> but
>     I don't see how I can use these results and put these in ggplot2.
>
>     I found the following website during my search:
>
> https://urldefense.proofpoint.com/v2/url?u=https-3A__www.fromthebottomoftheheap.net_2015_04_16_drawing-2Drarefaction-2Dcurves-2Dwith-2Dcustom-2Dcolours_&d=DwICAg&c=Cu5g146wZdoqVuKpTNsYHeFX_rg6kWhlkLF8Eft-wwo&r=aLEaSryyUcERVqcKVZl7lQ&m=ScKzUcnIZJ2da4_YAAzmizwFy-CbI90_F4SV_FKSLLc&s=-DiwE4s5JljqtJk5ZhKOE4Benr3yDXmDM19K7wNG3bI&e=
>     but it does not explain how to draw rarefaction curves with ggplot2.
>
>     This website mentions - and this is what I would like to be able to do
> in
>     ggplot2:
>
>     "Where I do think this sort of approach might work is if the samples
> in the
>     data set come from a few different groups and we want to colour the
> curves
>     by group.
>
>     col <- c("darkred", "forestgreen", "hotpink", "blue")set.seed(3)grp <-
>     factor(sample(seq_along(col), nrow(BCI2), replace = TRUE))cols <-
>     col[grp]
>
>     The code above creates a grouping factor grp for illustration
> purposes; in
>     real analyses you'd have this already as a factor variable in you data
>     somewhere. We also have to expand the col vector because we are
> plotting
>     each line in a loop. The plot code, reusing elements from the previous
>     plot, is shown below:
>
>     plot(c(1, max(Nmax)), c(1, max(Smax)), xlab = "Sample Size",
>          ylab = "Species", type = "n")abline(v = raremax)for (i in
> seq_along(out)) {
>         N <- attr(out[[i]], "Subsample")
>         lines(N, out[[i]], col = cols[i])}
>
>     [image: An attempt at rarefaction curves output with custom colours per
>     groups of curves.]An attempt at rarefaction curves output with custom
>     colours per groups of curves.
>
>
>     but I don't see how I adjust this code to make the same plot in
> ggplot2.
>
>
>
>     Anyone?
>
>     Thanks!
>     Ellen
>
>         [[alternative HTML version deleted]]
>
>     _______________________________________________
>     R-sig-ecology mailing list
>     R-sig-ecology using r-project.org
>
> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Dsig-2Decology&d=DwICAg&c=Cu5g146wZdoqVuKpTNsYHeFX_rg6kWhlkLF8Eft-wwo&r=aLEaSryyUcERVqcKVZl7lQ&m=ScKzUcnIZJ2da4_YAAzmizwFy-CbI90_F4SV_FKSLLc&s=w7PfOR1D2XX19m5JJqRubGPuMylTRoX3JYCpGkFoqnM&e=
>
>
> _______________________________________________
> R-sig-ecology mailing list
> R-sig-ecology using r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-ecology
>


-- 
In God we trust, all others bring data.

	[[alternative HTML version deleted]]



More information about the R-sig-ecology mailing list