Добавление стрелки под осью x на графиках R

Я пытаюсь добавить стрелки, обозначающие определенные координаты x ниже оси x на графике R. Моя ось x находится в y = 0, и когда я пытаюсь использовать отрицательные координаты y в arrows, поэтому стрелки будут перпендикулярны оси x, я получаю только самые края нанесенной стрелки (хотя есть некоторое пространство, например, g где нанесены метка оси X и деления).


person David B    schedule 06.08.2010    source источник


Ответы (2)


Параметр xpd можно использовать в стрелках, поэтому вы можете просто установить свои координаты за пределами области графика и установить для xpd значение TRUE. Например, если предположить, что xlim = c(0,10) и ylim = (0,10), и вы устанавливаете ось x на 0, тогда

arrows(1.4, -1, 1.4, 0, xpd = TRUE)

рисует вертикальную стрелку, указывающую вверх по оси x в позиции 1.4 на этой оси.

person John    schedule 06.08.2010
comment
Фантастический! Большое спасибо! +1 - person ECII; 06.12.2012
comment
Единственная проблема с этим подходом заключается в том, что если вы измените размер графика (я использую Rstudio), стрелки перепутаются. - person ECII; 07.12.2012
comment
Это происходит с легендами, относительным позиционированием множества вещей... вы просто снова запускаете свои графические команды. - person John; 07.12.2012

Вы можете сделать это, добавив дополнительный оверлей, вызвав par(new=TRUE) с уменьшенными полями. Например:

plot(1,1) ## start a plot
opar <- par(new = TRUE, ## add a new layer
            mar = c(0,0,0,0)) ## with no margins margins
## set up the plotting area for this layer
plot(1,1,xlim=c(0,1),ylim=c(0,1),type='n',xlab='',ylab='') 
arrows(0.1,0.05,0.5,0.05) ## add arrow
par(opar) ## return the plot parameters to their prior values

Редактировать: если вы хотите сохранить те же координаты, что и на исходном графике, вам нужно тщательно выбрать пределы по осям x и y. Это показано ниже:

plot(1,1,xlim=0:1,ylim=0:1)
arrows(0.1,0.05,0.5,0.05)
gpar <- par()
opar <- par(new = TRUE, mar = c(0,0,0,0),xaxs='i',yaxs='i')

m1 <- (gpar$usr[2] - gpar$usr[1])/(gpar$plt[2] - gpar$plt[1])
c1 <- gpar$usr[1] - m1*gpar$plt[1]
m2 <- (gpar$usr[4] - gpar$usr[3])/(gpar$plt[4] - gpar$plt[3])
c2 <- gpar$usr[3] - m2*gpar$plt[3]
xlim <- c(c1, m1 + c1)
ylim <- c(c2, m2 + c2)

plot(1,1,xlim=xlim,ylim=ylim,type='n',xlab='',ylab='')
arrows(0.1,0.05,0.5,0.05,col='red')
points(1,1,col='red')
par(opar)
person nullglob    schedule 06.08.2010
comment
+1 Спасибо, но как я могу начертить свои стрелки по определенной координате x на исходном графике? Перед вызовом par(new=TRUE), если я нарисую стрелки (10,1,20,1), они перейдут от (10,1) к (20,1) в системе координат моего графика; после вызова par(new=TRUE) мне нужно как-то преобразовать новые координаты в старые... - person David B; 06.08.2010
comment
Спасибо! Я думал, что такие вещи довольно распространены. - person David B; 06.08.2010
comment
На самом деле, мне никогда не приходилось делать это самому. Вероятно, есть более аккуратный способ сделать это. - person nullglob; 06.08.2010