r - Как аннотировать кривые - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы добавить метку к каждой линии графика кривой под соответствующим углом, как показано на рисунке ниже:

enter image description here

Вот мой скромный сценарий:

I0 <- log(1)
b <- .1
curve(exp(I0 - b * x), 0, 50, 
      xlab = "No. of Species (R)", ylab = "Rate (I or E)", col = "blue", lwd = 2)
d <- .01
curve(exp(d * x) - 1, 0, 50, add = TRUE, col = "orange", lwd = 2)

I0 <- log(1/2)
curve(exp(I0 - b * x), 0, 50, add = TRUE, lty = 2, col = "green", lwd = 2)
d <- .014
curve(exp(d * x) - 1, 0, 50, add = TRUE, lty = 2, col = "red", lwd = 2)

title(main = "The equilibrium model of island biogeography")

Этот сценарий создает сюжет, показанный ниже:

enter image description here

Я попытался следовать советамиз здесь , но не смог понять, как это сделать с моим сюжетом.

Есть какие-нибудь подсказки?

1 Ответ

0 голосов
/ 19 декабря 2018

Самым хитрым было выяснить, как использовать соотношение сторон, которое я нашел из этого письма .Поскольку у нас есть разные устройства для построения графиков, вам нужно будет изменить такие параметры, как размер текста и расстояние над линией текста.

По сути, мы просто вычисляем производную кривойв каждой точке вы хотите сделать аннотацию и настроить соотношение сторон окна рисунка.Оттуда вы рассчитываете угол в градусах.Если вам придется делать это много раз, вы можете рассмотреть возможность создания функции для каждой кривой и ее производной.

upshift = 0.025
I0 <- log(1)
b <- .1
curve(exp(I0 - b * x), 0, 50, xlab = "No. of Species (R)", ylab = "Rate (I or E)", col = "blue", lwd = 2)

# Get aspect ratio
w <- par("pin")[1]/diff(par("usr")[1:2])
h <- par("pin")[2]/diff(par("usr")[3:4])
asp <- w/h

angle = atan(-b * exp(I0) * exp(-b * 10) / asp) * 180 / pi
text(10, exp(I0 - b * 10) + upshift, "Near", srt = angle)

d <- .01
curve(exp(d * x) - 1, 0, 50, add = TRUE, col = "orange", lwd = 2)
angle = atan(d * exp(d * 30) / asp) * 180 / pi
text(30, exp(d * 30)-1 + upshift, "Large", srt = angle)

I0 <- log(1/2)
curve(exp(I0 - b * x), 0, 50, add = TRUE, lty = 2, col = "green", lwd = 2)
angle = atan(-b * exp(I0) * exp(-b * 10) / asp) * 180 / pi
text(5, exp(I0 - b * 5) + upshift, "Far", srt = angle)

d <- .014
curve(exp(d * x) - 1, 0, 50, add = TRUE, lty = 2, col = "red", lwd = 2)
angle = atan(d * exp(d * 30) / asp) * 180 / pi
text(30, exp(d * 30)-1 + upshift, "Small", srt = angle)

title(main = "The equilibrium model of island biogeography")

enter image description here

...