¿Cómo puedo agregar o hacer gráficas con doble eje en GGPLOT2?

publicado por: Anonymous

muy buen día.

Mis datos son los siguientes:
capinfl<- data.frame(capinst=c(79.9,79.1,81.1,79.2,80.5,80.2,78.7,80.4,79.1,80.8,80.1,78.2,78.8,78.6,79.1,80.2,79.9,79.9,79.1,79.7),infla=c(3.8,3.9,4.0,3.8,3.8,3.8,4.0,3.9,3.7,3.6,3.8,3.6,3.6,4.1,4.4,4.7,5.0,5.1,5.3,5.2))

Como se pueden dar cuenta, capinst tiene valores mas altos que infla, entonces al momento de gráficar, la escala sale muy desigual.

En excel, la grafica que buscamos sería mas o menos así. Si bien, no se puede en R, ¿que gráfico me recomendarían para completar un análisis similar?

introducir la descripción de la imagen aquí

¡Muchas gracias!

solución

Carlos Alberto,
en general no se recomienda poner hacer gráfico en un mismo panel con dos escalas. Son propensos a la mala interpretación. Por ejemplo, prestar atención a los cruces de las líneas que no deberían cruzarse en escala natural e inferir algo a partir de ahí. Por ese (buen) motivo la librería de gráficos ggplot:: hace prácticamente imposible usar dos escalas al mismo tiempo.

Una opción honorable es graficar cada serie en un panel con su propia escala. La interpretación esta menos sesgada, pero como cada línea queda en su propia escala se visualizan mejor las inflexiones.

Va código para hacer una versión con tus datos:

library(tidyverse) #Para gráficos y manipulación
library(lubridate) #Para crear la secuencia de fechas

capinfl<- data.frame(capinst=c(79.9,79.1,81.1,79.2,80.5,80.2,78.7,80.4,79.1,80.8,80.1,78.2,78.8,78.6,79.1,80.2,79.9,79.9,79.1,79.7),
                     infla=c(3.8,3.9,4.0,3.8,3.8,3.8,4.0,3.9,3.7,3.6,3.8,3.6,3.6,4.1,4.4,4.7,5.0,5.1,5.3,5.2), 
                     fecha = seq.Date(ymd("2007-01-01"), ymd("2017-09-01"), length.out = 20)) #Agrego 20 fechas que faltaban.
capinfl %>% 
  gather(key = key, value = value, -fecha) %>%   #Alargo a pares de clave-valor, servirá para tener una sola estructura de datos divisible en dos grupos
  ggplot(aes(x=fecha, y = value, group = 1)) +   
  geom_line() + 
  facet_wrap(~key,                               #Variable para el gráfico por paneles
             scales = "free",                    #Para que cada panel tenga su propia escala
             ncol = 1) +                         #Para alinear verticalmente los paneles
  theme_minimal() +                              #Fondo blanco
  scale_x_date(breaks = capinfl$fecha) +         #Una etiqueta por día
  theme(axis.text = element_text(angle = 90,     #Rotar 90 grados la etiqueta
                                 size = 6)) +    #Achicar el tamaño de la letra
  labs(y = NULL)                                 #Eliminar etiqueta redundante (ya está en el título de panel)

introducir la descripción de la imagen aquí

Se puede seguir trabajando para agregar mejores títulos, proporcionar mejor los espacios, etc. Pero esta es la base.

Una alternativa sería escalar las variables (entre 0-1, percentiles, etc.). Personalmente creo que los paneles son el mejor balance entre inteligibilidad del gráfico y fidelidad a los datos.

Respondido por: Anonymous

Leave a Reply

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