accumulation curve in R

后端 未结 2 1416
一个人的身影
一个人的身影 2021-01-06 14:43

I have data of species at 4 sites over several months. I have successfully created accumulation graphs using package vegan in R but I would like to plot all 4

2条回答
  •  礼貌的吻别
    2021-01-06 15:22

    Ok, so @jlhoward's solution is of course much simpler, and more sensible. But, since I hadn't thought of the obvious, and coded this up, I figured I may as well share it. It might be useful for related questions where the function at hand doesn't accept add.

    Load library and some example data:

    library(vegan)
    data(BCI)
    sp1 <- specaccum(BCI, 'random')
    
    # random modification to BCI data to create data for a second curve
    BCI2 <- as.matrix(BCI)
    BCI2[sample(prod(dim(BCI2)), 10000)] <- 0
    sp2 <- specaccum(BCI2, 'random')
    

    Plotting

    # Combine the specaccum objects into a list 
    l <- list(sp1, sp2) 
    
    # Calculate required y-axis limits
    ylm <- range(sapply(l, '[[', 'richness') + 
               sapply(l, '[[', 'sd') * c(-2, 2))
    
    # Apply a plotting function over the indices of the list
    sapply(seq_along(l), function(i) {
      if (i==1) { # If it's the first list element, use plot()
        with(l[[i]], {
          plot(sites, richness, type='l', ylim=ylm, 
               xlab='Sites', ylab='random', las=1)
          segments(seq_len(max(sites)), y0=richness - 2*sd, 
                   y1=richness + 2*sd)
        })    
      } else {
        with(l[[i]], { # for subsequent elements, use lines()
          lines(sites, richness, col=i)
          segments(seq_len(max(sites)), y0=richness - 2*sd, 
                   y1=richness + 2*sd, col=i)
        })     
      }
    })
    
    legend('bottomright', c('Site 1', 'Site 2'), col=1:2, lty=1, 
           bty='n', inset=0.025)
    

    enter image description here

提交回复
热议问题