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 <aty...@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: aty...@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-boun...@r-project.org on behalf of ellen.p...@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@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@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-sig-ecology > -- In God we trust, all others bring data. [[alternative HTML version deleted]] _______________________________________________ R-sig-ecology mailing list R-sig-ecology@r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-ecology