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.
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
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
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.