Saltar al contenido

Gráfico de serie temporal ggplot2 con flechas de dirección del viento codificadas por colores

Posterior a de esta prolongada recopilación de información dimos con la respuesta esta pregunta que tienen algunos de nuestros lectores. Te dejamos la respuesta y esperamos serte de gran ayuda.

Solución:

La trama que muestra arriba no da las direcciones correctas, por ejemplo dat$wd[1] es de aproximadamente 190°, por lo que si 0° corresponde a una flecha horizontal hacia la derecha, 190° debería darte una flecha que apunta hacia la izquierda y ligeramente hacia abajo.

Para obtener flechas con la dirección correcta, debe agregar el coseno y el seno de la dirección del viento al punto inicial de su flecha para definir su punto final (consulte el código a continuación). El problema difícil aquí es la escala de la flecha en la dirección x e y porque (1) estos ejes están en escalas completamente diferentes, por lo que la “longitud” de la flecha realmente no puede significar nada y (2) la relación de aspecto de su dispositivo de trazado distorsionará las longitudes visuales de las flechas.

A continuación, publiqué un boceto de la solución en el que escale el desplazamiento de la flecha en la dirección x e y en un 10 % del rango de las variables utilizadas para trazar, pero esto no produce vectores de longitud visual uniforme. En cualquier caso, la longitud de estas flechas no está bien definida porque, de nuevo, (a) los ejes x e y representan unidades diferentes y (b) cambiar la relación de aspecto de la gráfica cambiará la longitud de estas flechas.

## arrows go from  (datetime, pollutant) to
##                 (datetime, pollutant) + scaling*(sin(wd), cos(wd))
scaling <- c(as.numeric(diff(range(dat$datetime)))*60*60, # convert to seconds 
                    diff(range(dat$pollutant)))/10
dat <- within(dat, 
    x.end <- datetime  + scaling[1] * cos(wd / 180 * pi)
    y.end <- pollutant + scaling[2] * sin(wd / 180 * pi)
)


ggplot(data = dat, aes(x = datetime, y = pollutant)) +
    geom_line() +
    geom_segment(data = dat,
                 size = 1,
                 aes(x = datetime,
                     xend = x.end,
                     y = pollutant,
                     yend = y.end,
                     colour=ws),
                 arrow = arrow(length = unit(0.1, "cm"))) +
scale_colour_gradient(low="green", high="red") 

Y cambiar la relación de aspecto estropea las cosas:

Esto no está completo, pero espero que sea un comienzo para ti o para alguien más. ¿Entiendo correctamente lo siguiente?

  1. La x inicial de la flecha es el tiempo.
  2. La y inicial de la flecha es contaminante
  3. la longitud de la flecha es la velocidad del viento
  4. La orientación de la flecha es la dirección.
  5. El color de la flecha es la velocidad del viento.

Si es así, una parte que falta es la conversión de coordenadas polares a coordenadas cartesianas. (p. ej., http://www.engineeringtoolbox.com/converting-cartesian-polar-coordinates-d_1347.html)

El sistema de coordenadas es una parte faltante que no he descubierto. Este gráfico es una mezcla de dos sistemas de coordenadas. El punto de partida de una flecha se basa en (tiempo x contaminante). Pero el vector es una coordenada polar de dirección y velocidad del viento. Suponiendo que la relación de aspecto de (tiempo x contaminante) no es 1, entonces una brisa de 5 nudos del norte tendrá una duración diferente a la de una brisa de 5 nudos del sureste.

Hay que ajustar dos cosas. Una es la relación de aspecto (tiempo x contaminante). La otra son las dimensiones físicas del gráfico. No estoy seguro de cómo lidiar con el segundo, así que lo fijé en un valor constante. Pero imagina que querrás alguna forma de hacerlo mejor, probablemente consultando alguna propiedad de cuadrícula subyacente.

dat <- data.frame(
datetime = 0:100, 
#datetime = ISOdatetime(2013,08,04,0,0,0) + seq(0:23)*60*60, 
pollutant = 0 #Swap the next two lines for a nonuniform pollutant
#pollutant = runif(24, 25, 75)
)
## convert to a numeric variable
# dat$datetime <- 0
# dat$datetime <- as.numeric(dat$datetime)

#Adjust the aspect ratio
#   xrange <- range(dat$datetime)
xlimits <- c(-5, 100)
xrange <- diff(range(xlimits))
ylimits <- c(-5, 10)
yrange <- diff(range(ylimits))
aspectratio <- xrange/yrange

## create wind speed data
dat$ws <- 1
#   dat$ws <- runif(nrow(dat), 0, 15)

## create wind direction data
#dat$wd_degrees <- runif(nrow(dat), 0, 360)
dat$wd_degrees <- seq(from=0, to=360, length.out=nrow(dat))
dat$wd_radians <- dat$wd_degrees * (pi/180)  


## convert from polar to cartesian
dat$xend <- aspectratio * (dat$ws * sin(dat$wd_radians)) + dat$datetime
dat$yend <- aspectratio * (dat$ws * cos(dat$wd_radians)) + dat$pollutant

ggplot(data = dat, aes(x = datetime, y = pollutant)) +
geom_line() +
geom_segment(data = dat,          
             size = 1,
             aes(xend = xend,
                 yend = yend,
                 color = ws),
             arrow = arrow(length = unit(0.5, "cm"))) +
coord_fixed(xlim=xlimits, ylim=ylimits, ratio=1) +
theme()

Eres capaz de añadir valor a nuestro contenido contribuyendo tu experiencia en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *