我在几个月内有4个地点的物种数据。我已经使用R中的包vegan
成功创建了累积图,但我想在一个图上绘制所有4个网站。
起初我有一个包含所有网站和月份的数据表,但是当我绘制specaccum
时,结果是所有数据的累积曲线,无论网站如何。
因此我将每个站点拆分为一个单独的数据表,我将其加载到R中。在每个数据表中,第一行是物种名称,下面的每一行都是一个月。
例如,我加载了我的一个网站“FMR”的数据。然后我做了以下事情:
FMR <-specaccum(FMRJ2F, "random")
plot(FMR)
我为其他网站PP
,DUX
,PM
做了同样的事情。如何将所有4行放在一个图上?
答案 0 :(得分:5)
您可以在add=T
plot.specaccum(...)
参数
library(vegan)
data(BCI)
df <- lapply(c(1,21,41,61,81),function(i)specaccum(BCI[,seq(i,i+19)], method="random"))
plot(df[[1]])
for (i in 2:5) plot(df[[i]],add=T, col=i)
此代码段仅在vegan
中加载内置BSI数据集,并通过在BCI中的列子集上运行specaccum
来创建5个specaccum(...)
对象的列表。你不需要这个,因为你已经有了specaccum对象。
然后,我们创建第一个图,并使用add=T
添加每个新曲线。
答案 1 :(得分:1)
好的,所以@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)