¿Cómo agregar múltiples flechas a un camino según la dirección de la línea usando ggplot2?
Tengo un marco de datos del cual quiero trazar una ruta. El marco de datos también indica la dirección que deben tener las flechas. He estado utilizando el paquete ggplot2
y la función geom_path()
para esto, sin embargo, quiero agregar flechas que indiquen la dirección de la ruta. Usé la función arrow()
, pero no sé cómo hacer que las flechas sean como me gustaría (ejemplo a continuación).
library(ggplot2)
X <- c(0.596, 0.641, 0.695, 0.741, 0.788, 0.837,
0.887, 0.937, 0.993, 0.984, 0.934, 0.886,
0.838, 0.778, 0.738, 0.681, 0.642, 0.593)
Y <- c(23.630, 24.085, 24.643, 25.067, 25.491, 25.899,
26.305, 26.670, 27.049, 27.025, 26.836, 26.636,
26.429, 26.152, 25.965, 25.664, 25.442, 24.510)
Direction <- c(rep('arriba', 9), rep('abajo', 9))
DF <- data.frame(X, Y, Direction)
ggplot(data = DF,
aes(x = X,
y = Y)) +
geom_path(arrow = arrow(ends = 'both'))
Resultado de ggplot2
Resultado deseado
davy.ai
Para lograr el resultado deseado, puedes utilizar la función
geom_segment()
para trazar cada flecha como un segmento separado, con las coordenadas de inicio y fin adecuadas y la dirección de la cabeza de la flecha especificada. Aquí tienes un ejemplo de código:{r}
ggplot(data = DF,
aes(x = X,
y = Y)) +
# traza el camino como segmentos de línea separados
geom_segment(aes(x = X, xend = lead(X),
y = Y, yend = lead(Y),
# determina la dirección de la cabeza de la flecha
arrow = arrow(length = unit(0.3, "cm"),
type = "closed")),
# agrupa los segmentos por dirección para codificar por colores
# y evitar conectar segmentos con dirección opuesta
group = Direction, color = Direction) +
# agrega etiquetas para los puntos de inicio y fin
geom_text(aes(label = ifelse(is.na(Direction), "", Direction)),
# desplaza ligeramente las etiquetas de los puntos
nudge_x = c(-0.02, 0.02), nudge_y = c(0.06, -0.06)) +
# ajusta los límites y etiquetas de los ejes
scale_x_continuous(limits = c(0.55, 1.0), expand = c(0, 0)) +
scale_y_continuous(limits = c(24, 28), expand = c(0, 0)) +
labs(x = "X", y = "Y", title = "Dirección de la flecha a lo largo de un camino")
Este código crea segmentos de línea individuales entre puntos consecutivos en el data frame, con la dirección de la cabeza de la flecha determinada por la variable
Direction
. Los segmentos están agrupados por dirección, de modo que cada grupo tiene un color diferente y los segmentos con dirección opuesta no están conectados. Los puntos de inicio y fin están etiquetados utilizando la funcióngeom_text()
, con las etiquetas posicionadas ligeramente desplazadas de los puntos. Los límites y etiquetas de los ejes se ajustan para una mejor legibilidad.El gráfico resultante debería coincidir con el resultado deseado mostrado en la pregunta.