如何在稀有曲线(素食包装)中分别着色线条

时间:2014-03-28 13:52:45

标签: r vegan

我正在使用rarecurvevegan)为九个样本生成稀疏曲线,但我希望它们以三个为一组进行着色。

rarecurve的参数是:

rarecurve(x, step = 1, sample, xlab = "Sample Size", ylab = "Species", label = TRUE, ...)

...传递给'plot'的参数。但是,当我用col=c(rep("blue",3), rep("red",3), rep("darkgreen",3))替换省略号时,所有行都显示为蓝色。如何单独为线条着色?

计算每个图表需要将近三个小时,因此试错测试有点费力!

1 个答案:

答案 0 :(得分:5)

## example from ?vegan::rarecurve
library(vegan)
data(BCI)
S <- specnumber(BCI)
(raremax <- min(rowSums(BCI)))
Srare <- rarefy(BCI, raremax)
plot(S, Srare, xlab = "Observed No. of Species", ylab = "Rarefied No. of Species")
abline(0, 1)
rarecurve(BCI, step = 20, sample = raremax, col = "blue", cex = 0.6)

enter image description here

# using new function
plot(S, Srare, xlab = "Observed No. of Species", ylab = "Rarefied No. of Species")
abline(0, 1)
rarec(BCI, step = 20, sample = raremax, cex = 0.6)

enter image description here

问题出在vegan::rarecurve

的这些行中
for (ln in seq_len(length(out))) {
  N <- attr(out[[ln]], "Subsample")
  lines(N, out[[ln]], ...)

其中每一行都是由lines单独制作的,而...只是采用它在for (ln in seq_len(length(out))) { N <- attr(out[[ln]], "Subsample") lines(N, out[[ln]], col = cols[ln], ...) 传递的颜色参数中看到的第一种颜色,在您的情况下为蓝色。在对此循环应用简单的黑客之后:

cols

并在rarecurve函数中指定新参数col,而不是将plot传递到linescols = c(rep('red', nrow(x) / 2), rep('blue', nrow(x) / 2))

rarec <- function (x, step = 1, sample, xlab = "Sample Size", ylab = "Species", label = TRUE, cols = c(rep('red', nrow(x) / 2), rep('blue', nrow(x) / 2)), ...) { tot <- rowSums(x) S <- specnumber(x) nr <- nrow(x) out <- lapply(seq_len(nr), function(i) { n <- seq(1, tot[i], by = step) if (n[length(n)] != tot[i]) n <- c(n, tot[i]) drop(rarefy(x[i, ], n)) }) Nmax <- sapply(out, function(x) max(attr(x, "Subsample"))) Smax <- sapply(out, max) plot(c(1, max(Nmax)), c(1, max(Smax)), xlab = xlab, ylab = ylab, type = "n", ...) if (!missing(sample)) { abline(v = sample) rare <- sapply(out, function(z) approx(x = attr(z, "Subsample"), y = z, xout = sample, rule = 1)$y) abline(h = rare, lwd = 0.5) } for (ln in seq_len(length(out))) { N <- attr(out[[ln]], "Subsample") lines(N, out[[ln]], col = cols[ln], ...) } if (label) { ordilabel(cbind(tot, S), labels = rownames(x), ...) } invisible(out) }

这是新功能

{{1}}