R 中的累积曲线

问题描述 投票:0回答:2

我有 4 个地点几个月内的物种数据。 我已经使用 R 中的包

vegan
成功创建了累积图,但我想将所有 4 个站点绘制在一张图上。

起初我有一份包含所有站点和月份的数据表,但是当我绘制

specaccum
时,结果是所有数据累积的曲线,无论站点如何。

因此,我将每个站点分成一个单独的数据表,并将其加载到 R 中。在每个数据表中,第一行是物种名称,下面的每个附加行是一个月。

例如,我加载了我的网站之一“FMR”的数据。然后我做了以下事情:

FMR <-specaccum(FMRJ2F, "random")
plot(FMR)

我对其他网站也做了同样的事情,

PP
DUX
PM
。我怎样才能将所有 4 条线放在一个图上?

r plot vegan
2个回答
8
投票

您可以在

add=TRUE
中使用
plot.specaccum()
参数。

library(vegan)
data(BCI) 
l <- lapply(c(1,21,41,61,81), \(i) specaccum(BCI[, seq(i,i+19)], method="random"))
plot(l[[1]])
for (i in 2:5) plot(l[[i]], add=TRUE, col=i)

此代码片段仅从

BSI
加载内置
{vegan}
数据集,并通过在
l
中的列子集上运行
specaccum
来创建包含 5 个
specaccum()
对象的列表
BCI
。您不需要这样做,因为您已经拥有
specaccum
对象。

然后,我们创建第一个

plot
,并在
for
循环的每次迭代中添加一条带有
add=TRUE
的新曲线。


3
投票

好吧,@jlhoward 的解决方案当然更简单,也更明智。但是,由于我没有想到显而易见的事情并将其编码,所以我想我也可以分享它。对于手头的功能不接受的相关问题可能很有用

add

加载库和一些示例数据:

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')

绘图

# 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

© www.soinside.com 2019 - 2024. All rights reserved.