Как аннотировать опорную линию под тем же углом, что и сама опорная линия?

Мне нужно найти способ аннотировать опорную линию под тем же углом, что и сама опорная линия.

Следующее утверждение создаст справочную строку и метку над ней. Однако наклон линии может измениться, и мне нужно найти способ убедиться, что аннотация всегда находится под одним и тем же углом.

plot(1:10,1:10) 
abline(a=8, b=-1)
text(x=4, y=5, "reference line label", srt=-28)

Есть ли простой способ сделать это в R? заранее спасибо

3 ответа

Один из способов - установить соотношение сторон графика, используя asp аргумент, а затем рассчитать углы, используя указанный asp:

asp <- 2

plot(1:10,1:10, asp=asp) 
abline(a=8, b=-1)
text(x=4, y=5, "reference line label", srt=180/pi*atan(-1*asp))

abline(a=4, b=-2)
text(x=1, y=3, "reference line label", srt=180/pi*atan(-2*asp))

Установка другого asp:

asp <- 0.8

plot(1:10,1:10, asp=asp) 
abline(a=8, b=-1)
text(x=4, y=5, "reference line label", srt=180/pi*atan(-1*asp))

abline(a=4, b=-2)
text(x=1, y=3, "reference line label", srt=180/pi*atan(-2*asp))

Приложение к ответу @Andrie: даже если вы не установили вручную par("asp")Вы можете восстановить текущее рабочее соотношение сторон с помощью следующей функции:

getCurrentAspect <- function() {
   uy <- diff(grconvertY(1:2,"user","inches"))
   ux <- diff(grconvertX(1:2,"user","inches"))
   uy/ux
}

Таким образом, вы можете создать свой сюжет: набор asp <- getCurrentAspect(); и приступить к остальной части решения @Andrie.

Насколько я знаю, эта функция существует где-то в экосистеме R, но я ее еще не видела...

Аналогичное решение с ggplot2

data <- data.frame(x = 1:10, y = 1:10)
intercept <- 10
slope <- -1
ggplot(data, aes(x,y)) + geom_point(shape=1) +  
  geom_abline(intercept = intercept, slope = slope) + 
  geom_text(x=4, y=5, label="my label", angle=atan(slope)*180/pi)

с уклоном 1

intercept <- 10
slope <- -2
ggplot(data, aes(x,y)) + geom_point(shape=1) +  
  geom_abline(intercept = intercept, slope = slope) + 
  geom_text(x=4, y=5, label="my label", angle=atan(slope)*180/pi)

с уклоном 2

Рабочий пример для ggplot2:

slope<-1.3
asp<-1
p <- ggplot()
p<-p+scale_x_continuous(limits = c(1, 15), expand = c(0, 0)) 
p<-p+scale_y_continuous(limits = c(-8, 20), expand = c(0, 0)) 
p<-p+geom_abline(intercept = 0, slope = slope)
p<-p+coord_fixed(asp)
p<-p+annotate("text", label = "reference line label", x = 3.5, y = 5,  colour = "red",angle=atan(slope*asp)*180/pi)
p

текст с углом:

Другие вопросы по тегам