Introducción

Este documento describe como se pueden generar gráficos de series de tiempo con doble eje, un eje normal en orden ascendente y el otro eje en orden inverso. Utilizando las herramientas dentro de Rstudio de plot y ggplot2. Para estos ejemplos utilizaremos una serie de tiempo de “caudales en [m3/s]” y “precipitación en [mm]”, con escala de tiempo a nivel diario y con vacíos de información “NA”, en el periodo de tiempo de 1/enero/1990 hasta 31/diciembre/2010.

Método 1 - Mediante el uso de Plot

El programa Rstudio cuenta con herramientas para realizar la generación de gráficos de doble eje, para esto precisaremos el uso de la librería “lubridate” para el reconocimiento de datos con formato de fecha, ejemplo: “2/15/1990”.

Primero ubicamos el directorio de trabajo, donde se encuentra el archivo “.csv” con la información a utilizarse:

setwd("G://MasterHidrosistemasJaveriana//Modelacion de procesos Hidrologicos//InformacionIDEAM//") #Directorio de trabajo

Leemos el archivo “.csv” con su nombre específico, ya dentro del directorio de trabajo, mediante “read.csv”. Con el comando “header” en “T” significa “TRUE”, indica que se leera la primera fila como los nombres de cada columna, en el caso de “f”, “FALSE” la primera linea sera leida y tomada como dato. Luego previsualizamos los datos de cabecera y su formato original.

Datos <- read.csv("Prueba_Q_P.csv", # Lectura del archivo ".csv" con su nombre específico
                  header = T) # Lectura de la primera linea como nombres de las columnas
head(Datos)# Para mostrar los datos de cabecera
##          X Q_MEDIA_D.15067050 PTPG_TT_D.15065501
## 1 1/1/1990               3.24                  0
## 2 1/2/1990               3.14                  0
## 3 1/3/1990               3.04                  0
## 4 1/4/1990               2.84                  0
## 5 1/5/1990               2.66                  0
## 6 1/6/1990               2.58                  0

Hacemos el llamado de la libreria “lubridate”,el cual es un paquete de R que facilita el trabajo con fechas y horas.

library("lubridate")# para el uso de series de tiempo
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union

Asignación de los datos de entrada para cada variable, la segunda columna de caudal y la tercera para precipitación.

Caudal<-Datos[,2] 
Precip<-Datos[,3] 

Asiganamos la primera columna de fechas y al mismo tiempo cambiamos el “/” por “-”, en la siguiente linea de comando se realiza el reconocimiento de la FECHA mediante mdy() que significa el orden de mes-dia-año separado por guiones “-”.

Fecha <- gsub("/", "-", Datos[,1])
Fecha <- mdy(Fecha)# Reconoce la fecha de month-day-year

Asigamos las varaibles a nuevos nombres mas cortos para faciltiar el manejo porterior de las variables.

x <- Fecha
y1 <- Caudal
y2 <- Precip 

Mediante el comando “par(mar())”, ajustmos los parámtros de trazado, donde utiliza un vector numérico de longitud 4, que establece los tamaños de los márgenes en el siguiente orden: inferior, izquierdo, superior y derecho.

# Dibuja la primera gráfica usando el eje y1
par(mar = c(3, # Margen inferior
            4, # Margen izquierdo
            3, # Margen superior
            4) + 0.3) # Margen derecho  

Realizamos el ploteo de la primera variable “x,y1”, es decir la serie de tiempo de caudal, donde es posible modificar el tipo de linea “type=( p=puntos, l=líneas, b=Ambos (puntos y líneas, separados), s=escaleras, h= histograma, n=vacío)”, luego con “ylim” asignamos los limites del eje vertical, con el valor minimo y el valor maximo, “col” define el color a utilizarse en forma numeral del 1 al 8, especificando el nombre del color, ej. “col =”blue”“o mediante el comando”col = rgb(0, 0, 1)“, mas detalles sobre los colores. Luego con”ylab” nombramos el eje vertical “y1” y con “xlab” nombramos el eje “x”.

plot(x, y1, # Datos de los ejes
     type="l", # Tipo de trazo
     ylim = c(min(na.omit(Caudal)), # Valor minimo eje y1 (ignora los datos NA)
              max(na.omit(Caudal))*2), # Valor maximo eje y1 (ignora los datos NA)
     col = 4, # Color del grafico
     ylab="Caudal [m3/s]", # Nombre del Eje y1
     xlab=" ")  # Nombre del Eje x

Se establece el parámetro “par(new=True)” para superponer un nuevo eje vertical sobre el anterior gráfico.

Se dibuja la segunda gráfica usando el eje y2, es decir (x,y2), similar al grafico anterior, pero eligiendo otro color para diferenciar de la anterior y mediante “axes =FALSO” eliminamos el eje vertical nuevo.

plot(x, y1, # Datos de los ejes
     type="l", # Tipo de trazo
     ylim = c(min(na.omit(Caudal)), # Valor minimo eje y1 (ignora los datos NA)
              max(na.omit(Caudal))*2), # Valor maximo eje y1 (ignora los datos NA)
     col = 4, # Color del grafico
     ylab="Caudal [m3/s]", # Nombre del Eje y1
     xlab=" ")  # Nombre del Eje x
par(new = TRUE)  # Se establece el parámetro new=True para un nuevo eje 
plot(x, y2, # Datos de los ejes
     type="l", # Tipo de trazo
     col = 5, # Color del grafico
     axes = FALSE, # Elimina el eje
     ylim = rev(c(min(na.omit(Precip)), # Valor minimo eje y1 (ignora los datos NA)
                  max(na.omit(Precip))*2)), # Valor maximo eje y1 (ignora los datos NA)
     xlab="", # Nombre del Eje x
     ylab="") # Nombre del Eje y2

Finalmente agregamos el nuevo eje vertical mediante “axis”, que ahora estara ubicado en la parte derecha, mediante “side=4” (1=abajo, 2=izquierda, 3=arriba, 4=derecha), luego leemos y colocamos los valores del nuevo eje. Se puede observar que el comando “ylim=rev()” esto indica que el nuevo eje estara con valores invertidos. Con “mtext” nombramos el nuevo eje vertical, en posicion derecha “side=4” y con “line =3” ubicamos la posicion horizontal del nombre eje y2.

# Dibuja la primera gráfica usando el eje y1
par(mar = c(3, # Margen inferior
            4, # Margen izquierdo
            3, # Margen superior
            4) + 0.3) # Margen derecho             
plot(x, y1, # Datos de los ejes
     type="l", # Tipo de trazo
     ylim = c(min(na.omit(Caudal)), # Valor minimo eje y1 (ignora los datos NA)
              max(na.omit(Caudal))*2), # Valor maximo eje y1 (ignora los datos NA)
     col = 4, # Color del grafico
     ylab="Caudal [m3/s]", # Nombre del Eje y1
     xlab=" ")  # Nombre del Eje x

# Se establece el parámetro new=True para un nuevo eje
par(new = TRUE)         

# Dibuja la segunda gráfica usando el eje y2
plot(x, y2, # Datos de los ejes
     type="l", # Tipo de trazo
     col = 5, # Color del grafico
     axes = FALSE, # Elimina el eje
     ylim = rev(c(min(na.omit(Precip)), # Valor minimo eje y1 (ignora los datos NA) "rev()":INVIERTE EL EJE nuevo y2
                  max(na.omit(Precip))*2)), # Valor maximo eje y1 (ignora los datos NA)
     xlab="", # Nombre del Eje x
     ylab="") # Nombre del Eje y2

axis(side = 4, at = pretty(range(y2)))      
mtext("Precipitacion [mm]", # Añade texto al nuevo eje
      side = 4, # Posicion del texto (1=abajo, 2=izquierda, 3=arriba, 4=derecha)
      line = 3) # Posicion horizontal del nombre eje y2

El gráfico resultante nos muestra la serie de tiempo a nivel diario, mostrando el caudal en el eje vertical izquierdo y la precipitación en el eje vertical derecho con valores inversos para una mejor visualiazción, y en el eje horizontal compartido por ambas gráficas la variable de tiempo.

Método 2 - Mediante el uso de GGPLOT2

De la misma manera que el ejemplo anterior utilizamos los mismos datos de entrada, con esto en mente utilizamos la libreria de “ggplot2” y “lubridate” para realizar el procedimiento.

Seleccionamos el directorio de trabajo, leemos el archivo, asignamos las variables, tal como se realizó en el ejemplo anterior

setwd("G://MasterHidrosistemasJaveriana//Modelacion de procesos Hidrologicos//InformacionIDEAM//")
datos <- read.csv("Prueba_Q_P.csv", header = T)
#datos
Caudal <- datos[,2]
Precip <- datos[,3]
#Reconocimiento del dato de fecha
Fecha <- gsub("/", "-", datos[,1])
Fecha <- mdy(Fecha)# Reconoce la fecha de month-day-year
#Creación de matriz de datos
Dataunion <- data.frame(
  Fecha = Fecha,
  Caudal=Caudal, 
  Precip=Precip
  )

Mediante el comando “ggplot”, ingrersamos los datos del data.frame nombrado anteriormente “Dataunion”, luego “aes” asigna los datos de cada eje para un primer gráfico ejemplo “caudal vs tiempo”, “geom_line” indica el grosor de linea con “size” y su color como el ejemplo “color=”blue”” , por ultimo con “labs(title=”“) colocamos el nombre de la gráfica.

ggplot(data = Dataunion, 
       aes(x = Fecha, y = Caudal)) + 
  geom_line(size=1, 
            color = "blue") + 
  labs(title = "Caudal (m3/s)")

Ahora agregamos al grafico de caudal un segundo grafico en nuestro caso de ejemplo la precipitación, de la misma manera escogiendo el grosor de linea y el color. Con “Labs” renombramos el grafico nuevo y nombramos el nuevo eje vertical. En esta seccion utilizamos “na.omit()” para omitir los datos faltantes y modificamos los valores de percipitacin para que esten invertidos respecto al eje izquierdo, restando del valor maximo del eje izquierdo, y los niveles del eje de la misma manera.

#agregamos al grafico de caudal un segundo grafico el de precipitaciones
ggplot(data = Dataunion, aes(x = Fecha)) + 
  geom_line(aes(y = Caudal), size = 1, color = "blue") + 
  geom_line(aes(y = max(na.omit(Caudal))-Precip), size = 1, color = "green")+ #Invertimos los valores de la segunda variable, restandolas del valor maximo de la primera variable
  #colocamos el nombre del segundo eje
labs(title = "Caudal y Precipitación", y ="Caudal (m3/s)")+
  scale_y_continuous(sec.axis = sec_axis(~ max(na.omit(Caudal))-., # Invertimos los niveles del eje nuevo restandolos del valor maximo del eje izquierdo
                                         name = "Precipitaciòn (mm)"))

Como resultado se obtubo una gráfica con caracterizticas similares a la anterior mas un fodo de color plomo claro con cuadricula blanca, la designacion de datos es mas rapida que el anterior metodo pero el invertir los valores del segundo eje vertical mas los niveles presetan cierta dificultad.

Método 3 - Mediante el uso de latticeExtra

De la misma manera que el ejemplo anterior utilizamos los mismos datos de entrada, con esto en mente utilizamo las librerias “lubridate” y “latticeExtra”

setwd("G://MasterHidrosistemasJaveriana//Modelacion de procesos Hidrologicos//InformacionIDEAM//")

Datos <- read.csv("Prueba_Q_P.csv", header = T)

library("lubridate")# para el uso de series de tiempo
library("latticeExtra")# Hace que funcione xyplot
## Loading required package: lattice
## 
## Attaching package: 'latticeExtra'
## The following object is masked from 'package:ggplot2':
## 
##     layer
Caudal<-Datos[,2] 
Precip<-Datos[,3] 

Fecha <- gsub("/", "-", Datos[,1])
Fecha <- mdy(Fecha)# Reconoce la fecha de month-day-year

Dataunion <- data.frame(
  Caudal=Caudal, 
  Precip=Precip,   
  Fecha = Fecha
)

Mediante el uso de “xyplot()” se agrega dos ejes Y se construye cada serie por separado, asignando cada grafico a un nombre propio pro separado, teneindo en cuenta que la segunda grafica tendra el ejevertical de forma inversa medianet el uso ed “rev()”, como se muestra a continuación:

# se agrega dos ejes Y se construye cada serie por separado
obj1 <- xyplot(Caudal ~ Fecha, Dataunion,  # datos de entrada
               type = "l", # Tipo de trazo
               ylim = c(min(na.omit(Caudal)), # Dato mínimo del eje y
               max(na.omit(Caudal))*2), # Dato máximo del eje y
               lwd=2, # Grosor de la linea
               ylab="Caudal [m3/s]", # Nombramos el eje y
               xlab="Fecha") # Nombramos el eje x

obj2 <- xyplot(Precip ~ Fecha, Dataunion, 
               type = "l",
               ylim = rev(c(min(na.omit(Precip)),
               max(na.omit(Precip))*2)), 
               lwd=2,
               ylab="Precipitacion [mm]")

Finalmente con el comando “doubleYScale” sobreponemos ambas gráficas.

#Se realiza la grafica con el segundo eje Y
doubleYScale(obj1, obj2, add.ylab2 = TRUE)

Como podemos observar dela misma manera que los demas ejemplos obtenemos la grafica con dos ejes verticales, el segundo con valores invertidos. Gracias por su Atencion