Objetivo

En este documento mostraremos cómo utilizar loops para construir múltiples gráficos utilizando un código sencillo que pueda ser reutilizado.

Describiremos el proceso para la importación y procesamiento de los datos y para la elaboración de gráficos a partir de un dataset abierto de tasas de mortalidad infantil de Argentina.



1. Descarga de datos

En primer lugar, accederemos al dataset desde el portal de Datos Abiertos de Argentina y haremos algunas transformaciones para generar un formato más amigable de datos:

# descargamos los datos
dataTMI = read.csv("http://datos.salud.gob.ar/dataset/2eff770c-1c2b-4a22-9281-c3b5e9412086/resource/c1253897-d507-41f7-a3e1-6ed756e7243b/download/tasa-mortalidad-infantil-deis-1990-2022.csv")

# visualizamos la estructura del archivo
str(dataTMI)
## 'data.frame':    33 obs. of  26 variables:
##  $ indice_tiempo                        : chr  "1990-01-01" "1991-01-01" "1992-01-01" "1993-01-01" ...
##  $ mortalidad_infantil_argentina        : num  25.6 24.7 23.9 22.9 22 22.2 20.9 18.8 19.1 17.6 ...
##  $ mortalidad_infantil_caba             : num  16.8 15.2 14.9 14.6 14.3 13.1 14.7 12.2 13 10.7 ...
##  $ mortalidad_infantil_buenosaires      : num  24.2 24.2 23.5 22.3 21.8 22.2 20.9 18.8 19.1 16.6 ...
##  $ mortalidad_infantil_catamarca        : num  34.6 31.8 28.1 23.1 29.8 26.1 26.4 25.6 23.3 20.3 ...
##  $ mortalidad_infantil_cordoba          : num  22.2 22.3 19.6 20.8 20 20.5 19.4 16.3 16.8 15.3 ...
##  $ mortalidad_infantil_corrientes       : num  31.7 28.5 27.7 26.9 26.1 27.3 26.1 22.8 23.8 22.9 ...
##  $ mortalidad_infantil_chaco            : num  35.8 32.3 33.5 34.3 31.4 32.8 34.4 28.2 31.8 29 ...
##  $ mortalidad_infantil_chubut           : num  20.6 19.1 19.9 18 18.4 20.3 18 19.1 19.7 17.9 ...
##  $ mortalidad_infantil_entrerios        : num  24.3 23.2 22.1 22.7 20.4 20.5 19.5 19.6 18.8 19.5 ...
##  $ mortalidad_infantil_formosa          : num  33.2 24.5 32.3 27.9 30.7 30.5 31.4 29.8 26.9 23.6 ...
##  $ mortalidad_infantil_jujuy            : num  35.8 33.2 32.5 26.7 25.2 26.4 24.4 24 21.5 23.4 ...
##  $ mortalidad_infantil_lapampa          : num  22.2 20.5 21.3 17.9 15 17.4 12.4 12.1 14 15.2 ...
##  $ mortalidad_infantil_larioja          : num  28.8 27.2 26 24.1 22.8 22.1 25.7 19.3 22.9 20.6 ...
##  $ mortalidad_infantil_mendoza          : num  21.1 23.6 22.1 20.5 18.8 18.4 17.5 16.7 15.6 16.2 ...
##  $ mortalidad_infantil_misiones         : num  31.8 32.1 27 29.8 23.1 23.2 24.1 21.3 20 21.7 ...
##  $ mortalidad_infantil_neuquen          : num  16.9 15.6 16.2 16.2 15.3 14.1 15.7 13.8 14.8 12.4 ...
##  $ mortalidad_infantil_rionegro         : num  23.1 24.1 22.7 21.4 19.6 20.8 16.2 15.5 17.7 15.8 ...
##  $ mortalidad_infantil_salta            : num  32.3 32.9 32.8 27.7 29.8 26.8 25.5 20.5 22.6 21.2 ...
##  $ mortalidad_infantil_sanjuan          : num  24.4 24.6 23.7 21.3 21.3 25.2 21.6 21.5 21.7 20.7 ...
##  $ mortalidad_infantil_sanluis          : num  29.7 28.6 23.7 26.2 27.6 23.1 20.6 19.9 20.6 18.9 ...
##  $ mortalidad_infantil_santacruz        : num  20.7 19.9 20.6 18.5 15.9 21.9 12.8 16 18 13.2 ...
##  $ mortalidad_infantil_santafe          : num  28.3 22.2 20.9 19.8 17.8 17.6 15.7 16.3 16.2 15.2 ...
##  $ mortalidad_infantil_santiagodelestero: num  28.3 29.2 28.7 28.9 29 23.3 17.1 16.6 18.1 15.5 ...
##  $ mortalidad_infantil_tucuman          : num  28.5 28.6 28.8 27.1 23.9 28.9 28.8 19.6 19.9 22.5 ...
##  $ mortalidad_infantil_tierradelfuego   : num  27.9 16.7 11.2 15.2 13.6 11.1 9.7 11.2 11.9 7.8 ...
# convertimos indice_tiempo en una variable de texto que incluya sólo el año y vemos el resultado
dataTMI$indice_tiempo = substring(dataTMI$indice_tiempo,1,4)
head(dataTMI$indice_tiempo)
## [1] "1990" "1991" "1992" "1993" "1994" "1995"

Como se puede observar, el archivo tiene una fila por cada año y una columna por cada serie según el área geográfica



2. Construcción de un gráfico

Si quisieramos graficar la serie histórica de un área geográfica, por ejemplo la Provincia de Córdoba, podríamos tomar la columna correspondiente y hacer el gráfico.

# usamos Plotly para graficar

library(plotly)

grafico = plot_ly(
  dataTMI, 
  x = ~indice_tiempo, 
  y = ~mortalidad_infantil_cordoba, 
  type = 'scatter', 
  mode = 'lines')

# observamos el gráfico
grafico


3. Contrucción de gráficos en loop

Si el objetivo fuera reproducir el gráfico para cada una de las áreas que contiene el dataset, deberíamos repetir el código 25 veces (24 para cada jurisdicción y una para el total del país), lo que resultaría muy engorroso.

Con un loop podemos iterar por cada una de las columnas y crear un gráfico para cada área reutilizando el código del gráfico original.

# identificamos las columnas con las series de datos
columnasConSeries = colnames(dataTMI)[-1]

# creamos una lista donde vamos a almacenar los gráficos que vayamos creando
graficosTMI = list()

# creamos el loop
for (c in columnasConSeries) { # iteramos por cada una de las columnas asignando el nombre c
  grafico = plot_ly( # creamos el gráfico
    dataTMI, 
    x = ~indice_tiempo, 
    # modificamos esta línea con respecto al gráfico anterior para 
    # que la serie graficada varíe según la iteración (c)
    y = dataTMI[[c]],
    name = c,
    type = 'scatter', 
    mode = 'lines') %>%
    # editamos el diseño  
    layout(
        title = paste("Gráfico Serie", c),
        xaxis = list(showticklabels = FALSE),  
        yaxis = list(showticklabels = FALSE)   
        )
  
  # al finalizar cada iteración, agregamos el gráfico creado a la lista  
  graficosTMI[[paste0("grafico_",c)]] = grafico
}

# observamos los nombres de los elementos en la lista creada
names(graficosTMI)
##  [1] "grafico_mortalidad_infantil_argentina"        
##  [2] "grafico_mortalidad_infantil_caba"             
##  [3] "grafico_mortalidad_infantil_buenosaires"      
##  [4] "grafico_mortalidad_infantil_catamarca"        
##  [5] "grafico_mortalidad_infantil_cordoba"          
##  [6] "grafico_mortalidad_infantil_corrientes"       
##  [7] "grafico_mortalidad_infantil_chaco"            
##  [8] "grafico_mortalidad_infantil_chubut"           
##  [9] "grafico_mortalidad_infantil_entrerios"        
## [10] "grafico_mortalidad_infantil_formosa"          
## [11] "grafico_mortalidad_infantil_jujuy"            
## [12] "grafico_mortalidad_infantil_lapampa"          
## [13] "grafico_mortalidad_infantil_larioja"          
## [14] "grafico_mortalidad_infantil_mendoza"          
## [15] "grafico_mortalidad_infantil_misiones"         
## [16] "grafico_mortalidad_infantil_neuquen"          
## [17] "grafico_mortalidad_infantil_rionegro"         
## [18] "grafico_mortalidad_infantil_salta"            
## [19] "grafico_mortalidad_infantil_sanjuan"          
## [20] "grafico_mortalidad_infantil_sanluis"          
## [21] "grafico_mortalidad_infantil_santacruz"        
## [22] "grafico_mortalidad_infantil_santafe"          
## [23] "grafico_mortalidad_infantil_santiagodelestero"
## [24] "grafico_mortalidad_infantil_tucuman"          
## [25] "grafico_mortalidad_infantil_tierradelfuego"
# visualizamos los gráficos creados
subplot(graficosTMI, nrows = 5) %>% 
  layout(title = 'TMI Argentina')

De esta forma hemos construido 25 gráficos de una manera eficiente y reutilizando código. Esta misma lógica es aplicable al desarrollo de aplicaciones Shiny donde, por ejemplo, el conjunto de áreas a graficar podría provenir de un input del usuario y, a partir de un loop, construir un gráfico para cada una de las áreas seleccionadas para mostrar en la aplicación.