2015-08-13 3 views
1

Я пытаюсь создать стрелки с двойной строкой. Я не мог найти тип линии с двумя параллельными линиями. Это то, что я до сих пор:Создайте двойную линию/двойную стрелку в R ggplot2

library(ggplot2) 
library(grid) 

df_dblarrow <- data.frame(x0=1,y0=1,x1=3,y1=1) 
br <- 0.02 

p <- ggplot(df_dblarrow, aes(x=x0,y=y0))+ 
    geom_point(size=5)+ 
    ylim(0,2) 

#create a single arrow 
(p <- p + geom_segment(aes(xend=x1,yend=y1), 
       arrow = arrow(angle=30,length=unit(0.1,"npc"), type = "open"))) 

#create a two parallel lines 0.02 higher and lower (and a bit shorter) 
(p <- p + geom_segment(aes(x=x0,y=(y0+br),xend=(x1-0.015),yend=(y1+br))) + 
    geom_segment(aes(x=x0,y=(y0-br),xend=(x1-0.015),yend=(y1-br)))) 

Это дает график с линиями дерева, вместо этого 2 я хочу, так что я должен удалить средний. enter image description here Это становится слишком хаки. Я думал об использовании широкой черной линии с более тонкой белой линией сверху, но моя стрелочка тоже была бы широкой. Кто-нибудь имеет лучшую идею?

ответ

1

Вы могли бы сделать среднюю линию крошечное длины (не может быть равен нулю или направление стрелки неопределенна)

#create a single arrow 
p + 
    geom_segment(aes(x= x1 -(x1-x0)/100, xend=x1, yend=y1), 
       arrow = arrow(angle=30, length=unit(0.1,"npc"), 
          type = "open")) + 
#create a two parallel lines 0.02 higher and lower (and a bit shorter) 
    geom_segment(aes(x=x0,y=(y0+br),xend=(x1-0.015),yend=(y1+br))) + 
    geom_segment(aes(x=x0,y=(y0-br),xend=(x1-0.015),yend=(y1-br))) 

enter image description here

+0

Смарт, я не думал об этом (+1). Тем не менее, мне все равно придется найти правильную ширину и более короткое расстояние при проб и ошибок. И придумайте расчет для работы с линиями с другими углами. Нет ли более автоматического способа? – RHA