Как я могу построить функцию скорости роста населения в R? - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь воспроизвести график изображения, используя этот код в R:

N = 1:100

r = 1

K = 1

r1 = list(r*N*(1 - (N/K)))

plot(N, r1[[1]])

, но на графике появляются отрицательные значения. Что я делаю не так или как я могу отобразить изображение?

growth rate

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вы можете использовать функцию curve, которая предназначена для рисования кривых функций. Таким образом, вы избежите обхода генерации значений заранее.

Для базовой кривой c вам просто нужно кодировать переменную N как x:

curve(expr=r*x*(1 - (x/K)), from=1, to=100)

Чтобы полностью воспроизвести сюжет, мы немного откроем набор графических инструментов R.

op <- par(mar=c(4, 8, 2, 5))  ## set margins
curve(r*x*(1 - (x/K)), 1, 100, 
      xlab="", ylab="", xaxt="n", yaxt="n", 
      axes=FALSE, xaxs="i", yaxs="i",
      ylim=c(-8e3, 3e3), lwd=2)
axis(2, labels=FALSE, lwd.ticks=0)
abline(h=-5e3)
text(max(N), -5e3*1.05, "N", font=8, xpd=TRUE)
mtext("r", 2, .5, at=0, las=1, font=8)
mtext("Growth rate", 2, .5, at=2e3, las=1, font=6, cex=1.5)
## for the "K" tick and label in the plot, we need to solve the equation
## to get the intersect with our abitrary x axis at -5e3
f <- function(x, y) r*x*(1 - (x/K)) - y
x.val <- uniroot(f, y=-5e3, lower=0, upper=1000)$root
## and insert the solution as x.value
axis(1, x.val, labels=FALSE, pos=-5e3)
text(x.val, -5e3*1.1, "K", font=8, xpd=TRUE)
par(op)  ## reset margins

Результат

enter image description here

0 голосов
/ 09 апреля 2020

Если вы посмотрите на r1, вы увидите, что данные построены правильно. Значения начинаются с нуля и уменьшаются.

Если вы просто хотите сместить данные для быстрой визуализации, вы можете добавить масштабный коэффициент:

#add a scale factor - all values positive
r2<-r1[[1]]+10000
plot(N, r2)

или

#add a scale factor - span y = 0 
r3<-r1[[1]]+5000
plot(N, r3)

Добавить аннотацию к графику :

abline(h=0, col="black") #add line at zero
text(65, -600, "K", cex=1.5, col="black") #add text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...