Crea un mapa de Chile y visualiza datos comunales y regionales con mapas en R
25/11/2024
Visualizar datos geográficamente es una herramienta de comunicación y análisis de datos muy potente. En este tutorial te explico cómo obtener mapas comunales y regionales de Chile en R, y cómo crear un gráficos que visualizan variables numéricas en las comunas y regiones del país. En pocos pasos puedes transformar tus datos territoriales en visualizaciones mucho más densas e informativas.
Para crear mapas sencillos, donde una variable numérica se visualice en cada unidad territorial por medio de una escala de colores, solamente se necesitan dos cosas: la información geográfica que te permite visualizar el mapa en sí mismo, y los datos que podamos corresponder con las unidades territoriales del mapa.
En este breve tutorial veremos cómo obtener los mapas, como unir los datos al mapa, y cómo generar visualizaciones de estos mapas en R.
library(chilemapas) # mapas de chile
library(dplyr) # manipulación de datos
library(ggplot2) # visualización de datos
library(scales) # utilidad para visualización de datos
library(sf) # manipulación de datos geográficos
Mapa de Chile por comunas
El paquete
{chilemapas}
, desarrollado por
Mauricio Vargas, ofrece una colección de mapas terrestres de Chile con topología simplificada. Simplemente llamando el objeto mapa_comunas
obtenemos un dataframe con la información geográfica de cada comuna del país.
mapa_comunas <- chilemapas::mapa_comunas
mapa_comunas
# A tibble: 345 × 4
codigo_comuna codigo_provincia codigo_region geometry
<chr> <chr> <chr> <MULTIPOLYGON [°]>
1 01401 014 01 (((-68.86081 -21.28512, -68.921…
2 01403 014 01 (((-68.65113 -19.77188, -68.811…
3 01405 014 01 (((-68.65113 -19.77188, -68.635…
4 01402 014 01 (((-69.31789 -19.13651, -69.271…
5 01404 014 01 (((-69.39615 -19.06125, -69.400…
6 01107 011 01 (((-70.1095 -20.35131, -70.1243…
7 01101 011 01 (((-70.09894 -20.08504, -70.102…
8 02104 021 02 (((-68.98863 -25.38016, -68.987…
9 02101 021 02 (((-70.60654 -23.43054, -70.601…
10 02201 022 02 (((-67.94302 -22.38175, -67.955…
# ℹ 335 more rows
En este dataframe, la columna geometry
representa los polígonos de cada comuna. Esta información ya es suficiente para visualizar el mapa con R usando {ggplot2}
y
{sf}
, un paquete para trabajar con datos espaciales.
Para visualizar el mapa, primero usamos sf::st_set_geometry()
para asignar la geometría al dataframe. De este modo, le indicamos a R que estos datos deben graficarse en un mapa con determinadas coordenadas e información sobre proyección.
grafico_comunas <- mapa_comunas |>
st_set_geometry(mapa_comunas$geometry) |> # asignar geometría
ggplot() + # gráfico
geom_sf() # capa geométrica
grafico_comunas +
theme_classic()

Dado que Chile tiene islas muy alejadas del territorio continental, como Rapa Nui o Juan Fernández, el mapa queda con mucho espacio en blanco. Podemos recortar las coordenadas de la longitud del mapa (el eje x del gráfico) para que el mapa solamente abarque Chile continental:
grafico_comunas +
coord_sf(xlim = c(-77, -65)) +
theme_classic()

Mapa regional de Chile
Para generar un mapa de regiones, debemos crear las regiones. Esto no es complicado si pensamos que, en el fondo, las regiones son simplemente la unión de las comunas que las componen. El paquete {sf}
simplifica muchísimo el trabajo con datos geográficos, en este caso la unión de distintos polígonos en uno solo.
Agrupamos las filas del dataframe por la variable codigo_region
, para que todas las comunas que pertenecen a la misma región estén agrupadas, y usamos summarize()
junto a la función sf::st_union()
para que los polígonos de las comunas dentro de cada región se combinen, obteniendo polígonos regionales:
mapa_regiones <- mapa_comunas |>
group_by(codigo_region) |>
summarize(geometry = st_union(geometry)) # resumir los datos agrupados uniéndolos
mapa_regiones
# A tibble: 16 × 2
codigo_region geometry
<chr> <GEOMETRY [°]>
1 01 POLYGON ((-69.93023 -21.4246, -69.92376 -21.42622, -69.91932 -…
2 02 MULTIPOLYGON (((-68.0676 -24.32856, -67.91698 -24.26902, -67.8…
3 03 MULTIPOLYGON (((-71.58497 -29.02456, -71.58844 -29.02838, -71.…
4 04 MULTIPOLYGON (((-70.54551 -31.30742, -70.53877 -31.30074, -70.…
5 05 MULTIPOLYGON (((-71.33832 -33.45237, -71.33763 -33.44836, -71.…
6 06 POLYGON ((-71.5477 -34.87458, -71.54211 -34.87581, -71.53566 -…
7 07 POLYGON ((-70.41724 -35.63022, -70.41108 -35.6302, -70.40146 -…
8 08 MULTIPOLYGON (((-73.53466 -36.97378, -73.53245 -36.97829, -73.…
9 09 MULTIPOLYGON (((-73.35306 -38.73343, -73.35396 -38.72799, -73.…
10 10 MULTIPOLYGON (((-73.1691 -41.87755, -73.16135 -41.87781, -73.1…
11 11 MULTIPOLYGON (((-75.41754 -48.73857, -75.43249 -48.74372, -75.…
12 12 MULTIPOLYGON (((-70.35563 -52.94478, -70.34688 -52.93971, -70.…
13 13 POLYGON ((-70.47405 -33.8624, -70.47327 -33.86269, -70.46068 -…
14 14 MULTIPOLYGON (((-73.39503 -39.88698, -73.39672 -39.89339, -73.…
15 15 POLYGON ((-69.07223 -19.02723, -69.06394 -19.02607, -69.04748 …
16 16 POLYGON ((-72.38553 -36.91169, -72.37685 -36.91617, -72.37034 …
Obtenemos un dataframe con una fila por región, dado que las comunas fueron unidas en polígonos regionales. La columna geometry
ahora contiene la unión de las comunas que hicimos con la función st_union()
. Podemos visualizar este nuevo dataframe regional usando {ggplot2}
y {sf}
, igual que en el paso anterior:
grafico_regiones <- mapa_regiones |>
st_set_geometry(mapa_regiones$geometry) |> # especificar la geometría del mapa
ggplot() + # graficar
geom_sf() + # capa geográfica
coord_sf(xlim = c(-77, -65)) # recortar coordenadas
grafico_regiones +
theme_classic()

Ahora que tenemos nuestros mapas por comunas y por regiones, la idea es poder utilizarlos para visualizar datos en ellos.
Visualizar datos en el mapa
Para visualizar los datos en un mapa, aplicaremos colores a los distintos polígonos de nuestro mapa, ya sean comunas o regiones. La intensidad del color, o su posición dentro de la escala de color elegida, representará el valor de la variable numérica que queremos visualizar.
La idea de fondo para entender la visualización de datos geográficos por polígonos es entender que los mapas que obtuvimos contienen en cada fila un polígono (la información geográfica para dibujar la comuna o región), y además, en cada fila contienen información que identifica al polígono correspondiente. En nuestro caso, la información de los polígonos corresponde al código único territorial de las comunas, y el código de regiones en el caso de las regiones. Éstos son códigos numéricos que identifican cada unidad territorial del país.
La idea es poder agregarle datos a nuestro mapa, de manera que las filas que representan unidades territoriales tengan también columnas con datos sobre dichas unidades territoriales.
Entonces, deberíamos tener nuestro dataframe con el mapa, y otro dataframe donde tengamos los datos que queremos adjuntar al mapa. Si tenemos un mapa de comunas, tenemos que tener los datos por comuna que queremos agregarle al mapa.
Datos comunales
Obtener datos por web scraping
Para visualizar un mapa de datos comunales, primero obtendremos datos comunales desde Wikipedia. Usamos el paquete para hacer un web scraping y obtener una tabla de datos de las comunas del país.
library(rvest)
# dirección de wikipedia con tabla de comunas de Chile
url <- "https://es.wikipedia.org/wiki/Anexo:Comunas_de_Chile"
# obtener tabla con datos de comunas con web scraping
tabla <- session(url) |>
read_html() |>
html_table(convert = FALSE)
tabla[[1]]
# A tibble: 346 × 12
CUT (Código Único Territori…¹ Nombre `` Provincia Región `Superficie(km²)`
<chr> <chr> <chr> <chr> <chr> <chr>
1 15101 Arica "" Arica Arica… 4.799,4
2 15102 Camar… "" Arica Arica… 3.927
3 15201 Putre "" Parinaco… Arica… 5.902,5
4 15202 Gener… "" Parinaco… Arica… 2.244,4
5 01101 Iquiq… "" Iquique Tarap… 2.242,1
6 01107 Alto … "" Iquique Tarap… 572.9
7 01401 Pozo … "" Tamarugal Tarap… 13.765,8
8 01402 Camiña "" Tamarugal Tarap… 2.200,2
9 01403 Colch… "" Tamarugal Tarap… 4.015,6
10 01404 Huara "" Tamarugal Tarap… 10.474,6
# ℹ 336 more rows
# ℹ abbreviated name: ¹`CUT (Código Único Territorial)`
# ℹ 6 more variables: Población2020 <chr>, `Densidad(hab./km²)` <chr>,
# `IDH 2005` <chr>, `IDH 2005` <chr>, Latitud <chr>, Longitud <chr>
Luego obtener los datos, realizamos una pequeña limpieza. Limpiamos los nombres de las variables, seleccionamos las variables que nos interesan, y luego las convertimos apropiadamente a valores numéricos, donde tenemos que eliminar los separadores de miles, y transformar los separadores de decimales a puntos.
library(janitor)
library(stringr)
# limpiar datos
datos_comunas <- tabla[[1]] |>
clean_names() |>
# seleccionar y renombrar columnas
select(codigo_comuna = cut_codigo_unico_territorial,
nombre, region, superficie_km2,
poblacion = poblacion2020) |>
# eliminar espacios de la columna de población
mutate(poblacion = str_remove_all(poblacion, " "),
poblacion = as.numeric(poblacion)) |>
# eliminar los separadores de miles
mutate(superficie_km2 = str_remove_all(superficie_km2, "\\."),
# convertir comas a puntos
superficie_km2 = str_replace(superficie_km2, ",", "."),
superficie_km2 = as.numeric(superficie_km2))
datos_comunas
# A tibble: 346 × 5
codigo_comuna nombre region superficie_km2 poblacion
<chr> <chr> <chr> <dbl> <dbl>
1 15101 Arica Arica y Parinacota 4799. 247552
2 15102 Camarones Arica y Parinacota 3927 1233
3 15201 Putre Arica y Parinacota 5902. 2515
4 15202 General Lagos Arica y Parinacota 2244. 810
5 01101 Iquique Tarapacá 2242. 223463
6 01107 Alto Hospicio Tarapacá 5729 129999
7 01401 Pozo Almonte Tarapacá 13766. 17395
8 01402 Camiña Tarapacá 2200. 1375
9 01403 Colchane Tarapacá 4016. 1583
10 01404 Huara Tarapacá 10475. 3000
# ℹ 336 more rows
Ahora que tenemos una tabla de datos que contiene la columna codigo_comuna
con el código único territorial de las comunas, podemos unirla al mapa de comunas.
Agregar datos a los mapas con left_join()
Esta operación de unir dos tablas de datos diferentes, pero que coinciden en una columna en común, se realiza con la función left_join()
. El principio de left_join()
es que tenemos dos tablas de datos, y ambas tablas de datos tienen una misma columna, que poseen los mismos valores (en nuestro caso, una columna con las comunas o los códigos únicos territoriales de las comunas). Entonces, ambas tablas se van a unir según la correspondencias de estas columnas en común.
Ejemplo:
tabla_a <- tribble(~animal, ~favorito,
"gato", "pescado",
"mapache", "basura",
"perro", "carne")
tabla_b <- tribble(~animal, ~belleza, ~inteligencia, ~carisma,
"gato", 8, 6, 5,
"perro", 5, 2, 8,
"mapache", 10, 7, 2)
left_join(tabla_a,
tabla_b,
by = "animal")
# A tibble: 3 × 5
animal favorito belleza inteligencia carisma
<chr> <chr> <dbl> <dbl> <dbl>
1 gato pescado 8 6 5
2 mapache basura 10 7 2
3 perro carne 5 2 8
En el ejemplo, tenemos dos tablas, donde las dos tienen una misma columna con los mismos datos, y otras columnas con datos distintos. Usando left_join()
podemos unir ambas tablas de datos a partir de la columna que tienen en común. Como resultado obtenemos una nueva tabla que tiene todas las columnas.
Procedemos a unir los datos con el mapa usando left_join()
, especificando en el argumento by
que la unión sea a partir de la columna codigo_comuna
.
mapa_comunas_2 <- mapa_comunas |>
# adjuntar datos al mapa, coincidiendo por columna de código de comunas
left_join(datos_comunas,
by = join_by(codigo_comuna)) |>
relocate(geometry, .after = 0) # tirar geometría al final
mapa_comunas_2
# A tibble: 345 × 8
codigo_comuna codigo_provincia codigo_region nombre region superficie_km2
<chr> <chr> <chr> <chr> <chr> <dbl>
1 01401 014 01 Pozo Almo… Tarap… 13766.
2 01403 014 01 Colchane Tarap… 4016.
3 01405 014 01 Pica Tarap… 8934.
4 01402 014 01 Camiña Tarap… 2200.
5 01404 014 01 Huara Tarap… 10475.
6 01107 011 01 Alto Hosp… Tarap… 5729
7 01101 011 01 Iquique Tarap… 2242.
8 02104 021 02 Taltal Antof… 20405.
9 02101 021 02 Antofagas… Antof… 30718.
10 02201 022 02 Calama Antof… 15597.
# ℹ 335 more rows
# ℹ 2 more variables: poblacion <dbl>, geometry <MULTIPOLYGON [°]>
Como resultado, tenemos un nuevo dataframe que además de tener los datos geográficos de las comunas, también tiene nuevas columnas con datos que podemos visualizar.
Visualizar datos comunales
Para visualizar datos comunales en un mapa, especificamos la columna de geometría que contiene la información geográfica, y creamos un gráfico de {ggplot2}
. En este gráfico, especificamos que el relleno de los polígonos (fill
) se haga a partir de una de las variables numéricas.
Usamos la función geom_sf()
para agregar una capa de geometría a nuestro gráfico que contenga los polígonos territoriales de las comunas. Luego, definimos un tema, una paleta de colores, y corregimos la escala del eje horizontal.
mapa_comunas_2 |>
st_set_geometry(mapa_comunas_2$geometry) |> # asignar geometría
ggplot() + # gráfico
aes(fill = poblacion) +
geom_sf(linewidth = 0) + # capa geométrica
theme_classic() +
scale_fill_distiller(type = "seq", palette = 12,
labels = label_comma(big.mark = ".")) + # colores
scale_x_continuous(breaks = seq(-76, -65, length.out = 3) |> floor()) + # escala x
coord_sf(xlim = c(-77, -65)) + # recortar coordenadas
theme(legend.key.width = unit(3, "mm"))

Como resultado obtenemos un mapa coroplético, o mapa de coropletas, que es un mapa donde cada región o polígono está relleno de un color que representa un valor en una escala de una variable.
Acá hacemos otro mapa, usando el mismo código y simplemente cambiando la variable de relleno de los polígonos territoriales:
mapa_comunas_2 |>
st_set_geometry(mapa_comunas_2$geometry) |>
ggplot() +
aes(fill = superficie_km2) + # variable de relleno
geom_sf(linewidth = 0) +
theme_classic() +
scale_fill_distiller(type = "seq", palette = 11,
labels = label_comma(big.mark = ".")) +
scale_x_continuous(breaks = seq(-76, -65, length.out = 3) |> floor()) +
coord_sf(xlim = c(-77, -65)) +
theme(legend.key.width = unit(3, "mm"))

Mapa de una sola región, por comunas
Si queremos visualizar una sola región del país, subdividida por comunas, tan sencillo como agregar un filtro a los datos que filtre las filas que pertenecen a la región que nos interesa. En este caso, vamos a visualizar la población por comunas de la región del Libertador General Bernardo O’Higgins:
# filtrar datos
mapa_comunas_filtro <- mapa_comunas_2 |>
filter(codigo_region == "06")
# mapa
mapa_comunas_filtro |>
st_set_geometry(mapa_comunas_filtro$geometry) |>
ggplot() +
aes(fill = poblacion) +
geom_sf(linewidth = 0.12, color = "white") +
geom_sf_text(aes(label = comma(poblacion, big.mark = ".")),
size = 2, color = "white", check_overlap = T) +
theme_classic() +
scale_fill_distiller(type = "seq", palette = 12,
labels = label_comma(big.mark = ".")) +
theme(legend.key.width = unit(3, "mm")) +
theme(axis.title = element_blank())

En este caso, agregamos también la función geom_sf_text()
para agregar una capa nuestro gráfico que contiene las cifras para cada comuna. Hay que tener en consideración que poner números o textos sobre mapas suele ser complejo, porque el mapa ya es denso visualmente, y agregarle texto puede hacer que se vuelva ilegible. Hay que tener especial cuidado en resolver situaciones como textos que pasan por encima de bordes en el mapa, que se ubican incorrectamente dentro de los polígonos, o que se sobreponen uno sobre otros debido a que los polígonos se ven muy pequeños dentro del mapa.
Datos regionales
Obtener datos por web scraping
Para hacer el ejemplo de visualizar datos a nivel regional, nuevamente obtendremos datos a esta escala usando web scraping. Obtendremos una tabla del Producto Interno Bruto regional desde el sitio web de el Banco Central de Chile.
library(rvest)
# dirección del sitio del banco central
url <- "https://si3.bcentral.cl/Siete/ES/Siete/Cuadro/CAP_CCNN/MN_CCNN76/CCNN2018_PIB_REGIONAL_N/637899740344107786"
# obtener tabla con datos de comunas con web scraping
tabla_pib <- session(url) |>
read_html() |>
html_table(convert = FALSE)
Limpiamos los datos seleccionando las columnas que necesitamos, transformando la columna a tipo numérico, y filtrando las filas para quedar solamente con las que corresponden a las regiones de Chile:
datos_regiones <- tabla_pib [[1]] |>
janitor::clean_names() |>
select(region = serie, pib = x2023) |>
mutate(pib = str_remove_all(pib, "\\."),
pib = as.numeric(pib)) |>
filter(str_detect(region, "Región"))
datos_regiones
# A tibble: 16 × 2
region pib
<chr> <dbl>
1 Región de Arica y Parinacota 2169
2 Región de Tarapacá 7892
3 Región de Antofagasta 31290
4 Región de Atacama 6004
5 Región de Coquimbo 9174
6 Región de Valparaíso 20275
7 Región Metropolitana de Santiago 109143
8 Región del Libertador General Bernardo OHiggins 11910
9 Región del Maule 10348
10 Región de Ñuble 4106
11 Región del Biobío 16731
12 Región de La Araucanía 7743
13 Región de Los Ríos 3561
14 Región de Los Lagos 9432
15 Región de Aysén del General Carlos Ibáñez del Campo 1573
16 Región de Magallanes y de la Antártica Chilena 2490
Crear columna de códigos regionales
Los datos que obtuvimos no contienen una variable con el código único territorial de las regiones, dado que es un dato que está en desuso desde la promulgación de una ley en 2018 que prohíbe el uso de los números en comunicaciones públicas. Sin embargo, en muchas base de datos oficiales se sigue usando la numeración de las regiones, principalmente para evitar problemas de diferencias en los nombres de las regiones, por ejemplo, si contienen o no las palabras Región de o Región del para cada región, si contienen tildes o no, si contienen abreviaciones o no, si contienen símbolos como eñes o apóstrofes, etc. Todos estos problemas son resueltos por el uso de identificador numérico de las regiones.
Como el mapa que obtuvimos con el paquete {chilemapas}
utiliza el código regional, en el dato frente de nuestros datos crearemos una columna con los mismos códigos regionales, asignados a cada región a partir de la coincidencia con los textos. Por ejemplo, si el texto del nombre de la región contiene la palabra Arica, se le asigna el código 15
. Esta forma de asignar los códigos regionales puede ser inexacta, pero es muy sencillo confirmar si es que la asignación de códigos funciona correctamente, y también siempre es posible utilizar
expresiones regulares en {stringr}
para hacer coincidencias más flexibles, como por ejemplo, coincidir una palabra con un código sin importar si la palabra tiene o no tilde, o está mal escrita.
datos_regiones_2 <- datos_regiones |>
mutate(codigo_region = case_when(
str_detect(region, "Arica") ~ 15,
str_detect(region, "Tarapacá") ~ 1,
str_detect(region, "Antofagasta") ~ 2,
str_detect(region, "Atacama") ~ 3,
str_detect(region, "Coquimbo") ~ 4,
str_detect(region, "Valparaíso") ~ 5,
str_detect(region, "Metropolitana") ~ 13,
str_detect(region, "Libertador General") ~ 6,
str_detect(region, "Maule") ~ 7,
str_detect(region, "Ñuble") ~ 16,
str_detect(region, "Biobío") ~ 8,
str_detect(region, "Araucanía") ~ 9,
str_detect(region, "Los Ríos") ~ 14,
str_detect(region, "Los Lagos") ~ 10,
str_detect(region, "Aysén") ~ 11,
str_detect(region, "Magallanes") ~ 12
)) |>
rename(nombre_region = region)
Unir datos con mapa
Luego de crear la variable de códigos regionales, podemos hacer la unión entre ambas tablas de datos, mapas y datos regionales, usando left_join()
:
mapa_regiones_2 <- mapa_regiones |>
mutate(codigo_region = as.numeric(codigo_region)) |>
left_join(datos_regiones_2,
by = join_by(codigo_region)) |>
relocate(geometry, .after = 0) # tirar columna al final
mapa_regiones_2
# A tibble: 16 × 4
codigo_region nombre_region pib geometry
<dbl> <chr> <dbl> <GEOMETRY [°]>
1 1 Región de Tarapacá 7892 POLYGON ((-69.93023 -21.…
2 2 Región de Antofagasta 31290 MULTIPOLYGON (((-68.0676…
3 3 Región de Atacama 6004 MULTIPOLYGON (((-71.5849…
4 4 Región de Coquimbo 9174 MULTIPOLYGON (((-70.5455…
5 5 Región de Valparaíso 20275 MULTIPOLYGON (((-71.3383…
6 6 Región del Libertador General… 11910 POLYGON ((-71.5477 -34.8…
7 7 Región del Maule 10348 POLYGON ((-70.41724 -35.…
8 8 Región del Biobío 16731 MULTIPOLYGON (((-73.5346…
9 9 Región de La Araucanía 7743 MULTIPOLYGON (((-73.3530…
10 10 Región de Los Lagos 9432 MULTIPOLYGON (((-73.1691…
11 11 Región de Aysén del General C… 1573 MULTIPOLYGON (((-75.4175…
12 12 Región de Magallanes y de la … 2490 MULTIPOLYGON (((-70.3556…
13 13 Región Metropolitana de Santi… 109143 POLYGON ((-70.47405 -33.…
14 14 Región de Los Ríos 3561 MULTIPOLYGON (((-73.3950…
15 15 Región de Arica y Parinacota 2169 POLYGON ((-69.07223 -19.…
16 16 Región de Ñuble 4106 POLYGON ((-72.38553 -36.…
Visualizar datos regionales
Finalmente, visualizamos los datos en un mapa regional de la misma forma que lo hicimos con los mapas comunales. Esta vez, el mapa y los datos vienen en una fila por región, con la variable geometry
que conteniendo la geometría del polígono regional. Por tanto, el código es exactamente el mismo, y solamente cambia el dataframe que usamos para generar el gráfico:
mapa_regiones_2 |>
st_set_geometry(mapa_regiones_2$geometry) |> # asignar geometría
ggplot() + # gráfico
aes(fill = pib) +
geom_sf(linewidth = 0.12, color = "white") + # capa geométrica
theme_classic() +
scale_fill_distiller(type = "seq", palette = 18,
labels = label_comma(big.mark = ".")) +
scale_x_continuous(breaks = seq(-76, -65, length.out = 3) |> floor()) +
coord_sf(expand = F, xlim = c(-77, -65)) + # recortar coordenadas
theme(legend.key.width = unit(3, "mm"))

Visualizar datos geográficamente es una herramienta de comunicación y análisis de datos muy potente. Personalmente, encuentro que el potencial de la visualización de datos en mapas radica mucho más allá de simplemente mapear una variable a un territorio, sino a crear el incentivo para que la persona que ve el mapa analice el mapa en relación a todo el conjunto de conocimientos que tenemos acerca del espacio que habitamos, sus características sociales, y las desigualdades distribuidas en el territorio.
Si este tutorial te sirvió, por favor considera hacerme una pequeña donación para poder tomarme un cafecito mientras escribo el siguiente tutorial 🥺
- Fecha de publicación:
- November 25, 2024
- Extensión:
- 16 minute read, 3301 words
- Categorías:
- tutoriales