Подтвердить что ты не робот

Просмотр стрелок в ggplot2 geom_segment()

Я пытаюсь сделать заговор со стрелками в ggplot2, выглядя похожим на это, что было сделано с использованием базовых R-графиков. (цвета не важны)

enter image description here

Использование ggplot2:

library(ggplot2)
library(scales)
library(grid)


df3 <- structure(list(value1 = c(51L, 57L, 59L, 57L, 56L, 56L, 60L, 
66L, 61L, 61L), value2 = c(56L, 60L, 66L, 61L, 61L, 59L, 61L, 
66L, 63L, 63L), group = c("A", "B", "C", "D", "E", "A", "B", 
"C", "D", "E"), time = c("1999", "1999", "1999", "1999", "1999", 
"2004", "2004", "2004", "2004", "2004"), y_position = c(1L, 2L, 
3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L)), .Names = c("value1", "value2", 
"group", "time", "y_position"), row.names = c(NA, -10L), class = "data.frame") 




ggplot( df3, aes( x = value1, y = y_position, group = time, color = time)) +

geom_segment( x = min(df3$value1, df3$value2),  xend = max( df3$value1, df3$value2 ),
              aes( yend = y_position), color = "lightgrey", size = 19)  +


scale_y_continuous(  labels = df3$group, breaks = df3$y_position) + 

theme_classic() + theme( axis.line = element_blank(), axis.title = element_blank()  ) + 

geom_segment( aes( yend = y_position, xend = value2, color = time, group = time), size = 19, alpha = 0.9,

              arrow = arrow(length = unit(40, "points"),type = "closed", angle = 40)  )

Я получаю это:

enter image description here

Проблема в том, что стрелки выглядят неправильно (в том смысле, что они не похожи на первый сюжет). Использование geom_segment() не имеет значения.

Этот вопрос может дать ответ, но я надеялся на что-то менее хакерское: Указание параметров gpar для стрелок сетки в R

4b9b3361

Ответ 1

update: ggplot2 v2.1.0.9001

Если график находится в вашем текущем окне, вы можете отредактировать форму стрелки непосредственно с помощью

grid.force()
# change shape of arrows
grid.gedit("segments", gp=gpar(linejoin ='mitre'))
# change the shape in legend also
grid.gedit("layout", gp=gpar(linejoin ='mitre'))

Если график находится в вашем текущем окне, вы можете отредактировать форму стрелки непосредственно с помощью

grid.gedit("segments", gp=gpar(linejoin ='mitre'))

Теперь ggplot, похоже, изменил ключ легенды на форму стрелки, поэтому, если вы хотите изменить их форму, вы можете сделать это по всему графику с помощью

grid.gedit("gTableParent", gp=gpar(linejoin ='mitre'))

оригинальный ответ

Не менее хаки, но, может быть, проще? Вы можете редактировать grobs, возвращенные ggplotGrob.

Если p - ваш сюжет:

g <-  ggplotGrob(p)

idx <- grep("panel", g$layout$name)

nms <- sapply(g$grobs[[idx]]$children[[3]]$children , '[[', "name")

for(i in nms) {
    g$grobs[[idx]]$children[[3]] <- 
              editGrob(g$grobs[[idx]]$children[[3]], nms[i], 
                        gp=gpar(linejoin ='mitre'), grep=TRUE)
}

grid.newpage()
grid.draw(g)

enter image description here

Ответ 2

Кажется, что проблема заключается в том, что конструктор стрелок из пакета сетки перепутался, если size вызывается в блоке geom_segment.

так

p <- ggplot(df3) + coord_flip()

p1 <- p + geom_bar(aes(x=group,y=max(c(value1,value2))*1.1),width=0.2, stat="identity",position="identity",alpha=0.2)

df1<-filter(df3,time=="1999")

p1 + geom_segment(data=df1,aes(x=group,xend=group,y=value1,yend=value2),color="blue",size=8,arrow=arrow(angle=20,type="closed",ends="last",length=unit(1,"cm")))

выглядит нелепо, как вы показываете. Я пробовал обходное разделение сегмента на просто жирный сегмент и стрелку на узком сегменте (два слоя):

p2<-p1 + geom_segment(data=df1,aes(x=group,xend=group,y=value1,yend=value2), color="blue",arrow=arrow(angle=20,type="closed",ends="last",length=unit(1,"cm")))

p2 + geom_segment(data=df1,aes(x=group,xend=group,y=value1,yend=value2), color="blue",size=8)

но теперь конец жирового сегмента не мигрирует и поэтому скрывает стрелку.

Необходима установка параметра arrow.