¿Cómo graficar múltiples líneas con ggplot con eje X como variable de tiempo? (ver ejemplo)

publicado por: Anonymous

Preliminar:

Antes que nada, me disculpo por no subir mi código completo ya que es un poco largo y desconozco cómo subir un archivo aquí. Si alguien sabe, por favor oriénteme para poder actualizar mi pregunta.

Descargué de este sitio web un archivo de Excel:

datosabiertos.segob.gob.mx/DatosAbiertos/sesnsp_Incidencia_delictiva_Fuero_Federal/IDEFF

Lo guardé como csv y después de múltiples manipulaciones a la base de datos tengo esto:

> head(d1217full)
   año     mes comercio contra la salud narcomenudeo otros otros_lfcd otros_lgs transporte posesion produccion trafico total
1 2012   enero     0.16               0         5.87  0.13       0.02      0.00       0.02     4.34       0.07       0 10.61
2 2012 febrero     0.04               0         5.30  0.13       0.02      0.00       0.00     4.68       0.02       0 10.19
3 2012   marzo     0.07               0         4.81  0.07       0.05      0.00       0.00     6.12       0.07       0 11.21
4 2012   abril     0.40               0         4.48  0.13       0.04      0.00       0.00     4.85       0.00       0  9.90
5 2012    mayo     0.36               0         5.91  0.36       0.07      0.00       0.02     1.95       0.05       0  8.73
6 2012   junio     0.26               0         5.30  0.15       0.22      1.48       0.02     2.17       0.00       0  9.59

Al aplicar str tenemos:

> str(d1217full)
'data.frame':   72 obs. of  13 variables:
 $ año            : Factor w/ 6 levels "2012","2013",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ mes            : Factor w/ 12 levels "enero","febrero",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ comercio       : num  0.16 0.04 0.07 0.4 0.36 0.26 0.09 0.04 0.04 0.05 ...
 $ contra la salud: num  0 0 0 0 0 0 0 0 0 0.02 ...
 $ narcomenudeo   : num  5.87 5.3 4.81 4.48 5.91 5.3 4.27 6.6 6.29 9.84 ...
 $ otros          : num  0.13 0.13 0.07 0.13 0.36 0.15 0.13 0.09 0.02 0.09 ...
 $ otros_lfcd     : num  0.02 0.02 0.05 0.04 0.07 0.22 0.11 0.11 0.13 0.11 ...
 $ otros_lgs      : num  0 0 0 0 0 1.48 4.12 0.2 0.46 0.51 ...
 $ transporte     : num  0.02 0 0 0 0.02 0.02 0 0.02 0.02 0.02 ...
 $ posesion       : num  4.34 4.68 6.12 4.85 1.95 2.17 2.11 1.91 1.71 1.73 ...
 $ produccion     : num  0.07 0.02 0.07 0 0.05 0 0.02 0 0 0 ...
 $ trafico        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ total          : num  10.61 10.19 11.21 9.9 8.73 ...

Lo que deseo es poder hacer un gráfico que tenga las siguientes características:

  1. En el eje x se registre el año y el mes desde 2012/01 hasta 2017/12
  2. En el eje y se muestren, con diferentes líneas, los datos de las variables comercio hasta total, es decir, un total de 11 líneas, enfatizando en “total”

Dado que mis variables de tiempo son factores, ggplot no me permite graficar adecuadamente. Por ejemplo,

ggplot(d1217full, aes(año, total)) +
geom_line()

Da como resultado este plot, que por supuesto, es erróneo.

introducir la descripción de la imagen aquí

Lo anterior, sin considerar que aún faltaría poder incluir el resto de variables en el plot.

Pensé en crear un vector de tiempo desde cero, incorporarlo a mi base de datos y luego hacer un gráfico siguiendo algo como:

añosgto <- c(seq(as.Date("2012/1/1"), by = "month", length.out = 72))
añosgto <- as.character(añosgto)
temp  <- strsplit(añosgto, "-")
temp <- matrix(unlist(temp), ncol=3, byrow=T)
temp <- as.data.frame(temp)
temp <- mutate(temp, año_def=V1, mes_def=V2)
temp <- temp[,-(1:3)]
head(temp)

D1217 <- cbind(d1217full, temp)
D1217 <- select(D1217, -(1:2))

ggplot(D1217, aes(str_c(año_def, "/", str_pad(mes_def, 2, pad = 0)),
  total, group=total)) +
  geom_line() +
   scale_x_discrete(breaks = c("2012/12", "2013/12", "2014/12", "2015/12", "2016/12", "2017/12"))

Lo que da como resultado esto:

introducir la descripción de la imagen aquí

Como podrán ver, he intentado graficar sin éxito así que cualquier orientación será muy apreciada.

ACTUALIZACIÓN:

Cree un repositorio en github donde se encuentra la base de datos y el código.

https://github.com/LuisAlejandroCG/proyecto_gto

solución

Ya que estás usando dplyr aprovechemoslo al máximo:

d1217full %>%
    mutate(order = paste0(as.character(año), "-",sprintf("%02d",which(meses %in% mes)))) %>%
    gather(variable, valor, -`año`, -mes, -order) %>%
    ggplot(aes(x=order,y=valor,colour=variable, group=variable)) +
    geom_line() +
    scale_x_discrete(breaks=unique(paste0(as.character(d1217full$año), "-12"))) +
    theme(axis.text.x = element_text(angle = 90, hjust = 1))

El resultado:

Detalle:

  • mutate(order = paste0(año, "-",sprintf("%02d",which(meses %in% mes)))) para crear una columna nueva correspondiente al eje x, es más fácil así ya que año y messon factores y complicaría un poco si lo usamos directamente.

  • gather(variable, valor, -año, -mes, -order) con esto reorganizamos la estructura para tener observaciones para cada una de las columnas que luego ggplot tratará como variables y líneas independientes

  • El resto del código es simplemente la configuración del plot, configuramos los valores de x, y, cuales serán los grupos u quién define el color, lo último es configurara la orientación vertical de las etiquetas de los ejes x

  • Con scale_x_discrete(breaks=unique(paste0(as.character(d1217full$año), "-12"))) definimos los cortes en el eje x para que estos sean siempre diciembre de cada año tal como mencionas en tus comentarios.

introducir la descripción de la imagen aquí

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *