# Visualiza datos del Censo 2024 en mapas a nivel de manzana con R

_Mapas coropléticos con datos sociodemográficos chilenos_

> Recientemente lanzaron los datos 2024 del Censo de Población y Vivienda de Chile, incluyendo más de 200 variables a nivel de manzana. En este tutorial veremos dos formas de visualizar datos censales a nivel de manzana: con mapas estáticos en {ggplot2}, y con mapas interactivos con {mapgl}.

- URL: https://bastianolea.rbind.io/blog/mapas_censo_2024/
- Fecha: 2025-12-17
- Autor: Bastián Olea Herrera
- Etiquetas: mapas, Chile, datos
- Recursos: [Código ggplot](https://gist.github.com/bastianolea/0fc32985c92ffb569bcf3776f391163b) [Código mapGL](https://gist.github.com/bastianolea/a45ba0b6a068c7e42c3054e070d4c04d)

---

Ahora que recientemente lanzaron los datos 2024 del Censo de Población y Vivienda de Chile, me di unos minutos para visualizarlos. En este tutorial veremos dos formas de visualizar datos censales **a nivel de manzana**: con mapas estáticos en `{ggplot2}`, y con mapas interactivos en `{mapgl}`.

## Datos censales

[Descarga los datos cartográficos del Censo 2024 desde la página del INE](https://censo2024.ine.gob.cl/resultados/), entrando a *Cartografía Censal* y luego descargando el archivo **Cartografía País Censo 2024 (geoparquet)**.

[Descargar datos nivel manzana](https://storage.googleapis.com/bktdescargascenso2024/Cartografia/GEOPARQUET/Cartografia_censo2024_Pais.zip)

### Cargar cartografías censales

Los datos censales vienen en formato `geoparquet`, que es un formato moderno y eficiente para datos espaciales.

Podemos cargar datos en `geoparquet` con la función `read_parquet()` del paquete `{arrow}`.

Si no tenemos `{arrow}` instalado, lo instalamos con `install.packages("arrow")`.

``` r
library(arrow)
manzanas <- read_parquet("Cartografia_censo2024_Pais/Cartografia_censo2024_Pais_Manzanas.parquet")
```

Con la función `glimpse()` de `{dplyr}` podemos echar un vistazo a las columnas que vienen en la tabla, pero no las mostraremos aquí porque son más de 200 😂

``` r
library(dplyr)
glimpse(manzanas)
```

Ahora que tenemos los datos, vamos a ver cómo visualizarlos en mapas!

**Publicación relacionada:** [Explorar datos del Censo de Población y Vivienda 2024 con R](https://bastianolea.rbind.io/blog/censo_2024/index.md): Una de las dificultades más frecuentes en el análisis de datos es poder acceder a datos censales, porque su tamaño suele ser muy grande para la mayoría de los computadores, o bien imposible de abrir…

## Mapas estáticos

Para generar mapas coropléticos a partir de cartografía censal, lo que haremos será: **filtrar** la base de datos para obtener la unidad territorial que nos interesa, luego **convertir** la cartografía a formato `{sf}`, y finalmente **visualizar** con `{ggplot2}`.

**Publicación relacionada:** [Mapas y visualización de datos geoespaciales en R con {sf}](https://bastianolea.rbind.io/blog/mapas_sf/index.md): R cuenta con un muy amplio ecosistema para trabajar con datos geoespaciales. Uno de los paquetes más importantes es {sf}, que permite manipular datos espaciales a partir del estándar simple features…

### Preparar datos

Primero filtremos una comuna del país:

``` r
# filtrar datos
manzanas_comuna <- manzanas |> 
  filter(COMUNA == "LA FLORIDA")
```

Luego, convertimos a formato `{sf}`, para poder usar en R los polígonos que vienen en la cartografía, especificando un sistema de referencia de coordenadas (CRS) adecuado:

``` r
library(sf)

# convertir a sf
manzanas_comuna_sf <- manzanas_comuna |> 
  st_as_sf(crs = 4326) 
```

Ahora podemos ver la tabla de datos, que vienen con sus características espaciales incluídas:

``` r
manzanas_comuna_sf
```

    Simple feature collection with 3584 features and 217 fields
    Geometry type: MULTIPOLYGON
    Dimension:     XY
    Bounding box:  xmin: -70.61478 ymin: -33.57023 xmax: -70.51814 ymax: -33.50389
    Geodetic CRS:  WGS 84
    # A tibble: 3,584 × 218
       OBJECTID   CUT COD_REGION REGION        COD_PROVINCIA PROVINCIA COMUNA AREA_C
     *    <int> <int>      <int> <chr>                 <int> <chr>     <chr>  <chr> 
     1   148637 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     2   148638 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     3   148639 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     4   148640 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     5   148641 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     6   148642 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     7   148643 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     8   148644 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
     9   148645 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
    10   148646 13110         13 METROPOLITAN…           131 SANTIAGO  LA FL… URBANO
    # ℹ 3,574 more rows
    # ℹ 210 more variables: MANZENT <dbl>, DISTRITO <chr>, COD_DISTRITO <int>,
    #   COD_LOCALIDAD <int>, COD_ZONA <int>, LOCALIDAD <chr>, COD_ENTIDAD <int>,
    #   COD_MANZANA <int>, ENTIDAD <chr>, TIPO_MZ <chr>, COD_CATEGORIA <int>,
    #   CATEGORIA <chr>, MZ_BASE_CENSO <int>, ID_ENTIDAD <dbl>, ID_LOCALIDAD <dbl>,
    #   ID_DISTRITO <dbl>, ID_ZONA <dbl>, n_per <dbl>, n_hombres <dbl>,
    #   n_mujeres <dbl>, n_edad_0_5 <dbl>, n_edad_6_13 <dbl>, n_edad_14_17 <dbl>, …

Este ***dataframe* espacial** posee una columna especial (`SHAPE`) que contiene los polígonos territoriales.

Cada fila del *dataframe* corresponde a una unidad territorial, y en la columna `SHAPE` se indica la forma o el polígono que ocupa esa unidad en el territorio.

### Visualización

Vamos a generar mapas estáticos con [`{ggplot2}`, un paquete](https://bastianolea.rbind.io/blog/r_introduccion/tutorial_visualizacion_ggplot/) muy poderoso y personalizable para visualización de datos.

> **Aviso:** Si necesitas aprender a usar `{ggplot2}`, [revisa este tutorial completo de introducción a `{ggplot2}`](https://bastianolea.rbind.io/blog/r_introduccion/tutorial_visualizacion_ggplot/)!

Para visualizar estos datos en `{ggplot2}`, usamos la función de geometría `geom_sf()`, que está diseñada para trabajar con datos espaciales en formato `{sf}`. Esta función detecta la columna que contiene los datos espaciales y otras características espaciales, y permite visualizarlas como mapas.

``` r
library(ggplot2)

manzanas_comuna_sf |> 
  ggplot() +
  geom_sf() +
  theme_minimal(base_size = 10)
```

![](https://bastianolea.rbind.io/blog/mapas_censo_2024/index.markdown_strict_files/figure-markdown_strict/unnamed-chunk-7-1.png)

Con ésto anterior obtenemos el **mapa base**, generado a partir de los polígonos de la columna `SHAPE`.

**Publicación relacionada:** [Mapas y visualización de datos geoespaciales en R con {sf}](https://bastianolea.rbind.io/blog/mapas_sf/index.md): R cuenta con un muy amplio ecosistema para trabajar con datos geoespaciales. Uno de los paquetes más importantes es {sf}, que permite manipular datos espaciales a partir del estándar simple features…

Ahora podemos **especificar una variable censal** para visualizar, definiéndola en `aes()`. Luego podemos personalizar el gráfico agregando paletas de colores, ajustes visuales, y textos:

``` r
manzanas_comuna_sf |> 
  ggplot() +
  aes(fill = n_edad_60_mas) +
  geom_sf(color = "white", linewidth = 0.02) +
  scale_fill_fermenter(palette = 13) +
  theme_minimal(base_size = 10) +
  theme(axis.text.x = element_text(angle = 90, vjust = .5)) +
  guides(fill = guide_legend(title = "Población",
                             position = "top")) +
  labs(title = "Población de 60 años o más por manzana",
       subtitle = "Comuna de La Florida",
       caption = "Fuente: Censo 2024, INE")
```

![](https://bastianolea.rbind.io/blog/mapas_censo_2024/index.markdown_strict_files/figure-markdown_strict/unnamed-chunk-8-1.png)

### Reutilizar mapa

Podemos repetir todo el proceso, cambiando sólo un par de líneas, para obtener el **mapa de otra variable en una comuna distinta**:

``` r
manzanas |> 
  # filtrar
  filter(COMUNA == "PUENTE ALTO") |> # comuna
  # convertir
  st_as_sf(crs = 4326) |> 
  # graficar
  ggplot() +
  aes(fill = n_discapacidad) + # variable
  geom_sf(color = "white", linewidth = 0.01) +
  scale_fill_fermenter(palette = 3) +
  theme_minimal(base_size = 10) +
  theme(axis.text.x = element_text(angle = 90, vjust = .5)) +
  guides(fill = guide_legend(title = "Población",
                             position = "top")) +
  labs(title = "Población con discapacidad por manzana",
       subtitle = "Comuna de Puente Alto",
       caption = "Fuente: Censo 2024, INE")
```

![](https://bastianolea.rbind.io/blog/mapas_censo_2024/index.markdown_strict_files/figure-markdown_strict/unnamed-chunk-9-1.png)

Lo bueno de disponer del código es que podemos [**automatizar la creación de mapas** para distintas comunas o regiones](https://bastianolea.rbind.io/blog/ggplot_purrr/), simplemente cambiando los filtros y las variables que queremos graficar, o podemos cambiar el nivel territorial cargando uno de los otros archivos, o bien, [realizando una operación de resumen](https://bastianolea.rbind.io/blog/r_introduccion/dplyr_summarize/) sobre los datos.

**Publicación relacionada:** [Tutorial: visualización de datos con {ggplot2}](https://bastianolea.rbind.io/blog/r_introduccion/tutorial_visualizacion_ggplot/index.md): {ggplot2} es una librería de visualización de datos bastante popular en el mundo de la ciencia de datos. Sus principales características son su atractivo, su conveniencia para la exploración de datos,…

### Mapa por comunas

Solamente como prueba, filtremos una región del país, luego agrupemos por comunas, y sumemos la población de una de las variables en cada comuna con `summarize()` para **pasar desde un mapa por manzanas a un mapa por comunas**:

``` r
sf_use_s2(FALSE)

comunas <- manzanas |> 
  # filtrar
  filter(REGION == "METROPOLITANA DE SANTIAGO") |> 
  # convertir
  st_as_sf(crs = 4326) |> 
  # resumir por comuna
  group_by(COMUNA) |> 
  summarize(n_ocupado = sum(n_ocupado), # sumar datos por grupo
            SHAPE = st_union(SHAPE)) # unir polígonos por grupo
```

Obtenemos como resultado una tabla de datos por comuna:

``` r
comunas
```

    Simple feature collection with 52 features and 2 fields
    Geometry type: MULTIPOLYGON
    Dimension:     XY
    Bounding box:  xmin: -71.51187 ymin: -34.05721 xmax: -70.22923 ymax: -32.96357
    Geodetic CRS:  WGS 84
    # A tibble: 52 × 3
       COMUNA          n_ocupado                                               SHAPE
       <chr>               <dbl>                                  <MULTIPOLYGON [°]>
     1 ALHUÉ                2542 (((-71.24133 -34.05452, -71.2413 -34.05457, -71.24…
     2 BUIN                47409 (((-70.85738 -33.81385, -70.85736 -33.81381, -70.8…
     3 CALERA DE TANGO      5893 (((-70.83452 -33.66046, -70.83477 -33.66032, -70.8…
     4 CERRILLOS           36188 (((-70.73703 -33.51005, -70.73702 -33.51005, -70.7…
     5 CERRO NAVIA         52273 (((-70.76262 -33.42757, -70.76262 -33.42757, -70.7…
     6 COLINA              62631 (((-70.71874 -33.32434, -70.71884 -33.32437, -70.7…
     7 CONCHALÍ            54640 (((-70.68942 -33.38985, -70.68916 -33.3904, -70.68…
     8 CURACAVÍ            10081 (((-71.15734 -33.41664, -71.15734 -33.41663, -71.1…
     9 EL BOSQUE           64497 (((-70.68728 -33.5783, -70.68727 -33.57831, -70.68…
    10 EL MONTE            13596 (((-71.05384 -33.69958, -71.05354 -33.69968, -71.0…
    # ℹ 42 more rows

**Publicación relacionada:** [Mapas y visualización de datos geoespaciales en R con {sf}](https://bastianolea.rbind.io/blog/mapas_sf/index.md): R cuenta con un muy amplio ecosistema para trabajar con datos geoespaciales. Uno de los paquetes más importantes es {sf}, que permite manipular datos espaciales a partir del estándar simple features…

Ahora podemos visualizar un mapa de la **población ocupada por comuna** en la Región Metropolitana:

``` r
comunas |> 
  ggplot() +
  aes(fill = n_ocupado) + # variable
  geom_sf(color = "white", linewidth = 0.01) +
  colorspace::scale_fill_continuous_sequential(palette = "Sunset", na.value = "white",
                                               labels = scales::label_number(big.mark = "."),
                                               breaks = c(0, 50000, 100000, 150000, 200000, 250000)) +
  theme_minimal(base_size = 10) +
  theme(axis.text.x = element_text(angle = 90, vjust = .5),
        legend.key.width = unit(3, "mm")) +
  guides(fill = guide_colorbar(title = "Ocupados/as", position = "right")) +
  coord_sf(xlim = c(-70.83, -70.47), 
           ylim = c(-33.3, -33.68)) +
  labs(title = "Población ocupada",
       subtitle = "Región Metropolitana",
       caption = "Fuente: Censo 2024, INE")
```

![](https://bastianolea.rbind.io/blog/mapas_censo_2024/index.markdown_strict_files/figure-markdown_strict/unnamed-chunk-12-1.png)

> **Nota:** Para más información sobre visualización de mapas de Chile comunales y regionales, revisa [este tutorial](https://bastianolea.rbind.io/blog/tutorial_mapa_chile/) sobre mapas básicos de Chile, o [este tutorial](https://bastianolea.rbind.io/blog/tutorial_mapa_chile_subdere/) para usar cartografías oficiales.

------------------------------------------------------------------------

## Mapas interactivos

Para visualizar **mapas interactivos** en R existen varias opciones, como [el paquete `{leaflet}`](https://rstudio.github.io/leaflet/), pero yo quería usar [el paquete `{mapgl}`](https://bastianolea.rbind.io/blog/mapas_mapgl/), desarrollado por [Kyle Walker](https://walker-data.com) que permite crear mapas interactivos usando [MapLibre](https://maplibre.org), una biblioteca de código abierto para mapas web.

Este paquete se caracteriza por el acceso que ofrece a usuarixs de R a visores de mapas interactivos de alta calidad y alto rendimiento.

Primero instalamos [`{mapgl}`](https://walker-data.com/mapgl/):

``` r
install.packages("mapgl")
```

Luego lo cargamos:

``` r
library(mapgl)
```

Y probamos su funcionamiento con un **mapa vacío** (prueba haciendo zoom o navegando el mapa con el cursor)

``` r
maplibre(center = c(-71.5, -33.0), 
         zoom = 3)
```

_[Visualización interactiva: disponible en la versión web de esta publicación]_

Ahora usemos `{mapgl}` con los datos censales. Podemos **repetir el proceso** de filtrado de la comuna o región que nos interese:

``` r
# filtrar y seleccionar
manzanas_comuna <- manzanas |> 
  filter(COMUNA == "VALPARAÍSO") |> 
  select(REGION, n_edad_60_mas, SHAPE)
```

Luego hacemos la misma conversión a `{sf}` para trabajar mejor con datos espaciales:

``` r
# convertir a sf
manzanas_comuna_sf <- manzanas_comuna |> 
  st_as_sf(crs = 4326)
```

Finalmente podemos **visualizar los datos en un mapa interactivo** con la función `maplibre_view()`, especificando la variable que queremos graficar en el mapa:

``` r
manzanas_comuna_sf |> 
  maplibre_view(column = "n_edad_60_mas")
```

_[Visualización interactiva: disponible en la versión web de esta publicación]_

¡Así de simple! 💜

**Publicación relacionada:** [Mapas interactivos con {mapgl} para visualizar datos geoespaciales en R](https://bastianolea.rbind.io/blog/mapas_mapgl/index.md): {mapgl} es un paquete de R increíble para visualizar datos geográficos de manera interactiva, por medio de los visores de mapas Mapbox y MapLibre, sobre los cuales puedes visualizar tus cartografías y…

Lo interesante es que `{mapgl}` también permite hacer cosas [mucho más increíbles](https://walker-data.com/mapgl/articles/layers-overview.html) usando [MapLibre](https://www.mapbox.com/), una plataforma de mapas de primer nivel que tiene muchas más opciones de personalización y estilos de mapas, incluyendo figuras tridimensionales, edificios, efectos visuales y más.

**Publicaciones sobre mapas:**

- [Plantilla de mapa interactivo de Chile con R, Shiny y MapGL](https://bastianolea.rbind.io/blog/2026-10-14/index.md)
- [Mapas interactivos con {mapgl} para visualizar datos geoespaciales en R](https://bastianolea.rbind.io/blog/mapas_mapgl/index.md)
- [Optimizando la visualización de datos geográficos complejos con {pmtiles}](https://bastianolea.rbind.io/blog/2026-08-03/index.md)
- [Probando visores de mapas interactivos en R con {mapgl}](https://bastianolea.rbind.io/blog/2026-07-29/index.md)
- [Mapas bivariados de adultos mayores en relación a viviendas propias en las comunas de Chile](https://bastianolea.rbind.io/blog/2026-07-24/index.md)
