Сначала необходимо выяснить координаты для основания перпендикулярных сегментов, а затем вызвать функцию segments
, которая может принимать векторы координат в качестве входных данных (нет необходимости в цикле).
perp.segment.coord <- function(x0, y0, lm.mod){
#finds endpoint for a perpendicular segment from the point (x0,y0) to the line
# defined by lm.mod as y=a+b*x
a <- coef(lm.mod)[1] #intercept
b <- coef(lm.mod)[2] #slope
x1 <- (x0+b*y0-a*b)/(1+b^2)
y1 <- a + b*x1
list(x0=x0, y0=y0, x1=x1, y1=y1)
}
Теперь просто вызовите сегменты:
ss <- perp.segment.coord(temperature, diseasesev, severity.lm)
do.call(segments, ss)
#which is the same as:
segments(x0=ss$x0, x1=ss$x1, y0=ss$y0, y1=ss$y1)
Обратите внимание, что результаты не будут выглядеть перпендикулярно, если вы не убедитесь, что x-единица и y-единица вашего графика имеют одинаковую видимую длину (изометрические шкалы). Вы можете сделать это, используя pty="s"
, чтобы получить квадратный график и установить xlim
и ylim
в тот же диапазон.