es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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 de ggplot2

Resultado deseado

Resultado deseado

Tags:  , , , ,

Answer

  1. Avatar for 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ón geom_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.

Comments are closed.