geom_vline geom_path geom_line r ggplot2

geom_path - Buscar flechas en ggplot2 geom_segment()



geom_line (2)

El desafío parece ser que el constructor de flechas del paquete de cuadrícula se arruina si se invoca el size en el bloque geom_segment .

asi que

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")))

se ve ridículo como se muestra. Probé la solución alternativa de separar el segmento en solo un segmento gordo y una flecha en un segmento delgado (dos capas) como sigue:

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)

pero ahora el extremo del segmento gordo no está mitrado y oscurece la flecha.

Parece que es necesario corregir el parámetro de arrow .

Intento hacer una trama con flechas en ggplot2 con un aspecto similar a este, que se hizo usando base R grapics. (los colores no son importantes)

Usando 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) )

Entiendo esto:

El problema es que las flechas se ven mal (en el sentido de que no se ven como la primera trama). Usar geom_segment () no es importante.

Esta pregunta puede dar la respuesta, pero esperaba algo menos raro: especificar la configuración de gpar para las flechas de la grilla en R


actualización: ggplot2 v2.1.0.9001

Si el diagrama está en su ventana actual, puede editar la forma de la flecha directamente con

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''))

Si el diagrama está en su ventana actual, puede editar la forma de la flecha directamente con

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

ggplot ahora parece haber cambiado la clave de la leyenda a una forma de flecha, por lo que si desea cambiar la forma de estos también, puede hacer esto en toda la gráfica con

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

respuesta original

No menos hacky, pero quizás más fácil? Puede editar los grobs devueltos por ggplotGrob .

Si p es tu trama:

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)