Mi objetivo es construir un diagrama de barras con flechas al final de las barras. Fui por geom_segment
con arrow
definido. Quiero asignar una columna a la transparencia, pero la estética alfa no parece funcionar bien con el objeto de flecha. Aquí está el fragmento de código:
tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>%
ggplot() + geom_segment(aes(x = 0, xend = n, y = y, yend = y, alpha = transparency),
colour = 'red', size = 10, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) +
scale_y_continuous(limits = c(5, 35))
Se puede observar fácilmente que el arrow
objeto no se ve bien con valores más bajos de alpha
, mostrando su esqueleto en lugar de una forma simple y transparente. ¿Hay una forma de prevenirlo?
tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>% ggplot() + geom_segment(aes(x = 0, xend = n-10, y = y, yend = y, alpha = transparency), colour = 'red', size = 10) + geom_segment(aes(x = n-0.1, xend = n, y = y, yend = y, alpha = transparency), colour = 'red', size = 1, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) + scale_y_continuous(limits = c(5, 35))
Respuestas:
Podemos crear una nueva geom,
geom_arrowbar
que podemos usar como cualquier otra geom, por lo que en su caso daría la trama deseada simplemente haciendo:Y contiene 3 parámetros,
column_width
,head_width
yhead_length
que le permiten cambiar la forma de la flecha si no lo hace como los valores por defecto. También podemos especificar el color de relleno y otra estética según sea necesario:¡El único inconveniente es que tenemos que escribirlo primero!
Siguiendo los ejemplos en la viñeta ggplot2 que se extiende , podemos definir nuestro
geom_arrowbar
de la misma manera que se definen otras geoms, excepto que queremos poder pasar nuestros 3 parámetros que controlan la forma de la flecha. Estos se agregan a laparams
lista dellayer
objeto resultante , que se utilizará para crear nuestra capa de flechas:Ahora "todo" lo que queda es definir qué
GeomArrowBar
es a. Esta es efectivamente unaggproto
definición de clase. La parte más importante es ladraw_panel
función miembro, que toma cada línea de nuestro marco de datos y la convierte en formas de flecha. Después de algunas matemáticas básicas para resolver a partir de las coordenadas xey, así como nuestros diversos parámetros de forma, cuál debería ser la forma de la flecha, produce unagrid::polygonGrob
para cada línea de nuestros datos y la almacena en agTree
. Esto forma el componente gráfico de la capa.Esta implementación está lejos de ser perfecta. Le faltan algunas funciones importantes, como los límites de eje predeterminados razonables y la capacidad de hacerlo
coord_flip
, y producirá resultados poco estéticos si las puntas de flecha son más largas que la columna completa (aunque de todos modos es posible que no desee utilizar dicho diagrama en esa situación) . Sin embargo, sensiblemente tendrá la flecha apuntando hacia la izquierda si tiene un valor negativo. Una mejor implementación también podría agregar una opción para puntas de flecha vacías.En resumen, necesitaría muchos ajustes para solucionar estos (y otros) errores y prepararlos para la producción, pero es lo suficientemente bueno como para producir algunos gráficos agradables sin demasiado esfuerzo mientras tanto.
Creado el 2020-03-08 por el paquete reprex (v0.3.0)
fuente
Podrías usar
geom_gene_arrow
desdelibrary(gggenes)
fuente