Ordenar las comunas de Chile de norte a sur en R

25/6/2025

mapas Chile

Complementando el post sobre ordenar regiones de Chile de norte a sur, en esta publicación veremos cómo ordenar las comunas del país de norte a sur. Esto puede servirnos para mostrar datos a nivel comunal de una gran cantidad de regiones de una manera más intuitiva, en los casos donde ordenarlas por orden alfabético no entrega mucha información, o cuando queramos mostrar en nuestras visualizaciones o tablas que el factor geográfico incide en el dato principal.

Partamos con una tabla de datos de varias comunas del país. Es necesario que estas comunas cuenten con su código único territorial, el códgo numérico que identifica de manera única a cada región del país. Si tu base de datos no tiene los códigos únicos territoriales, tendrás que realizar una unión entre los nombres de las comunas y los códigos, que puedes encontrar en csv y rds en este respositorio..

library(dplyr)

comunas <- tibble::tribble(
                ~nombre_comuna, ~codigo_comuna,
                    "Rancagua",           6101,
                "San Fernando",           6301,
                   "Coyhaique",          11101,
                  "La Pintana",          13112,
                       "Rengo",           6115,
                "Puerto Montt",          10101,
         "San Pedro de la Paz",           8108,
               "Alto Hospicio",           1107,
                     "Chillán",          16101,
                       "Angol",           9201,
                  "Talcahuano",           8110,
                      "Calama",           2201,
                  "Concepción",           8101,
                     "Hualpén",           8112,
                   "La Serena",           4101,
                      "Calera",           5502,
                    "Valdivia",          14101,
                 "Cerro Navia",          13103,
                       "Lampa",          13302,
               "Quinta Normal",          13126,
                  "Huechuraba",          13107,
                     "Linares",           7401,
                        "Tomé",           8111,
                "Viña del Mar",           5109,
                    "Recoleta",          13127,
                   "Talagante",          13601,
                  "Valparaíso",           5101,
                     "Coronel",           8102,
                        "Buin",          13402,
                       "Macul",          13118,
                "Punta Arenas",          12101,
                       "Talca",           7101,
                 "Los Ángeles",           8301,
                 "Puente Alto",          13201,
                     "Copiapó",           3101,
                      "Curicó",           7301,
                    "Coquimbo",           4102,
                   "Melipilla",          13501,
                    "Vitacura",          13132,
                 "Antofagasta",           2101,
                 "Chiguayante",           8103,
                       "Renca",          13128,
                   "Quilicura",          13125,
         "Pedro Aguirre Cerda",          13121,
                      "Ovalle",           4301,
                "San Bernardo",          13401,
                   "Los Andes",           5301,
                 "San Joaquín",          13129,
                      "Colina",          13301,
                    "Quillota",           5501,
                   "Peñalolén",          13122,
            "Estación Central",          13106,
                   "San Ramón",          13131,
                    "Lo Prado",          13117,
                       "Arica",          15101,
                 "San Antonio",           5601,
                   "Cerrillos",          13102,
                    "Santiago",          13101,
                "Lo Barnechea",          13115,
                      "Temuco",           9101,
                  "La Florida",          13110,
                  "San Felipe",           5701,
                       "Ñuñoa",          13120,
                 "La Cisterna",          13109,
                     "Machalí",           6108,
               "Independencia",          13108,
                   "La Granja",          13111,
               "Villa Alemana",           5804,
                  "San Miguel",          13130,
                  "Las Condes",          13114,
                   "Lo Espejo",          13116,
                     "Quilpué",           5801,
                    "Conchalí",          13104,
                    "Peñaflor",          13605,
                   "El Bosque",          13105,
                       "Maipú",          13119,
                    "La Reina",          13113,
                    "Pudahuel",          13124,
                 "Providencia",          13123,
               "Padre Hurtado",          13604,
                     "Iquique",           1101,
                      "Osorno",          10301
         )

Puedes copiar y pegar este código para obtener en tu sesión de R la tabla con comunas. Si ejecutamos esta tabla de datos, veremos que las regiones no están ordenadas geográficamente:

comunas
# A tibble: 82 × 2
   nombre_comuna       codigo_comuna
   <chr>                       <dbl>
 1 Rancagua                     6101
 2 San Fernando                 6301
 3 Coyhaique                   11101
 4 La Pintana                  13112
 5 Rengo                        6115
 6 Puerto Montt                10101
 7 San Pedro de la Paz          8108
 8 Alto Hospicio                1107
 9 Chillán                     16101
10 Angol                        9201
# ℹ 72 more rows

Si hacemos un gráfico con estas comunas, veremos que el orden del eje con las comunas será alfabético, dado que las comunas son una variable de tipo carácter o texto:

library(ggplot2)

comunas |> 
  ggplot() +
  aes(codigo_comuna, nombre_comuna, fill = codigo_comuna) +
  geom_col() +
  theme_minimal() +
  scale_x_continuous(expand = c(0, 0))

Tampoco nos serviría ordenarla por los códigos únicos territoriales, dado que éstos empiezan con el código de las regiones, y como vimos en el otro post, los códigos regionales no ordenan geográficamente las regiones, y menos a las comunas.

Una forma de ordenar las comunas de Chile geográficamente de norte a sur es valiéndonos de la geografía vertical del país. Podemos obtener un mapa de Chile con el paquete {chilemapas}, y luego extraer la latitud de las comunas, para usarla como variable de ordenamiento de las comunas.

La función chilemapas::mapa_comunas de {chilemapas} nos entrega un dataframe con los datos geográficos del país a nivel comunal.

library(dplyr)
library(chilemapas)
Loading required package: sf

Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE

La documentacion del paquete y ejemplos de uso se encuentran en https://pacha.dev/chilemapas/.
Visita https://buymeacoffee.com/pacha/ si deseas donar para contribuir al desarrollo de este software.
# obtener mapa
mapa_chile <- chilemapas::mapa_comunas |> 
  mutate(codigo_comuna = as.numeric(codigo_comuna)) |> 
  select(codigo_comuna, geometry)

mapa_chile
# A tibble: 345 × 2
   codigo_comuna                                                        geometry
           <dbl>                                              <MULTIPOLYGON [°]>
 1          1401 (((-68.86081 -21.28512, -68.92172 -21.30035, -68.98939 -21.317…
 2          1403 (((-68.65113 -19.77188, -68.81182 -19.74362, -68.81575 -19.733…
 3          1405 (((-68.65113 -19.77188, -68.63545 -19.78062, -68.62511 -19.785…
 4          1402 (((-69.31789 -19.13651, -69.2717 -19.23735, -69.14291 -19.2967…
 5          1404 (((-69.39615 -19.06125, -69.40025 -19.06897, -69.40296 -19.071…
 6          1107 (((-70.1095 -20.35131, -70.12438 -20.31578, -70.10985 -20.2743…
 7          1101 (((-70.09894 -20.08504, -70.1023 -20.11401, -70.12001 -20.1551…
 8          2104 (((-68.98863 -25.38016, -68.98731 -25.38411, -68.98696 -25.393…
 9          2101 (((-70.60654 -23.43054, -70.60175 -23.43515, -70.60133 -23.438…
10          2201 (((-67.94302 -22.38175, -67.95564 -22.39233, -67.96315 -22.393…
# ℹ 335 more rows

A partir de este mapa, usamos el paquete {sf} para extraer los centroides de las comunas, que son el punto central de la geometría de cada polígono. Luego, a partir del centroide podemos obtener la latitud de estos puntos, para ver qué tan al norte o sur está cada comuna.

library(sf)

# extraer latitud desde los polígonos comunales
mapa_chile_latitud <- mapa_chile |> 
  mutate(centroide = st_centroid(geometry),
         longitud = sf::st_coordinates(centroide)[,1],
         latitud = sf::st_coordinates(centroide)[,2])
  
mapa_chile_latitud
# A tibble: 345 × 5
   codigo_comuna                     geometry             centroide longitud
           <dbl>           <MULTIPOLYGON [°]>           <POINT [°]>    <dbl>
 1          1401 (((-68.86081 -21.28512, -68… (-69.50811 -20.77126)    -69.5
 2          1403 (((-68.65113 -19.77188, -68… (-68.84517 -19.35443)    -68.8
 3          1405 (((-68.65113 -19.77188, -68… (-68.91311 -20.48006)    -68.9
 4          1402 (((-69.31789 -19.13651, -69… (-69.50102 -19.36999)    -69.5
 5          1404 (((-69.39615 -19.06125, -69… (-69.66358 -19.60151)    -69.7
 6          1107 (((-70.1095 -20.35131, -70.… (-70.01261 -20.18971)    -70.0
 7          1101 (((-70.09894 -20.08504, -70… (-70.04836 -20.92498)    -70.0
 8          2104 (((-68.98863 -25.38016, -68…  (-69.8618 -25.30966)    -69.9
 9          2101 (((-70.60654 -23.43054, -70… (-69.40757 -24.27784)    -69.4
10          2201 (((-67.94302 -22.38175, -67… (-68.62665 -22.16826)    -68.6
# ℹ 335 more rows
# ℹ 1 more variable: latitud <dbl>

Con esto podemos simplemente ordenar por latitud y generar un orden numérico del 1 al 345.

orden_comunas <- mapa_chile_latitud |> 
  arrange(desc(latitud), longitud) |> 
  mutate(orden_comuna = row_number()) |> 
  select(codigo_comuna, orden_comuna)

orden_comunas
# A tibble: 345 × 2
   codigo_comuna orden_comuna
           <dbl>        <int>
 1         15202            1
 2         15201            2
 3         15101            3
 4         15102            4
 5          1403            5
 6          1402            6
 7          1404            7
 8          1107            8
 9          1405            9
10          1401           10
# ℹ 335 more rows

Obtenemos una tabla con los códigos únicos territoriales y la latitud de cada comuna. Ahora podemos unir estas columnas con nuestros datos usando left_join():

# a los datos originales, agregarle la tabla con el orden de las comunas
comunas_ordenadas <- comunas |> 
  left_join(orden_comunas, join_by(codigo_comuna)) |> 
  # ordenar observaciones
  arrange(orden_comuna)

comunas_ordenadas
# A tibble: 82 × 3
   nombre_comuna codigo_comuna orden_comuna
   <chr>                 <dbl>        <int>
 1 Arica                 15101            3
 2 Alto Hospicio          1107            8
 3 Iquique                1101           11
 4 Calama                 2201           15
 5 Antofagasta            2101           19
 6 Copiapó                3101           25
 7 La Serena              4101           32
 8 Coquimbo               4102           34
 9 Ovalle                 4301           38
10 San Felipe             5701           56
# ℹ 72 more rows

Intentamos nuevamente con el gráfico a ver cómo sale:

# intento incorrecto de gráfico ordenado
comunas_ordenadas |> 
  arrange(orden_comuna) |> 
  ggplot() +
  aes(x = codigo_comuna,
      y = nombre_comuna, 
      fill = codigo_comuna) +
  geom_col() +
  theme_minimal() +
  guides(fill = guide_none()) +
  scale_x_continuous(expand = c(0, 0))

Al igual como nos pasó con el ordenamiento de regiones, la variable nombre_comuna es una variable de texto (tipo caracter) y que no tiene un orden intrínseco, así que se asume que su orden es alfabético. Por lo tanto, tenemos que darle un orden a esta variable, convirtiéndola a factor con el orden de una segunda variable numérica usando fct_reorder(); en otras palabras, darle a nombre_comuna el orden que tiene la variable numérica orden_comuna:

library(forcats)

# ordenar variable a partir de una segunda variable numérica
comunas_ordenadas_2 <- comunas_ordenadas |> 
  mutate(nombre_comuna = fct_reorder(nombre_comuna, 
                                     orden_comuna, 
                                     .desc = T)) 

Ahora si repetimos el mismo gráfico que antes, vemos que el orden de las comunas ahora sí es geográfico! Arica está arriba y Punta Arenas abajo, como corresponde.

# crear un gráfico
comunas_ordenadas_2 |> 
  ggplot() +
  aes(x = orden_comuna,
      y = nombre_comuna, 
      fill = orden_comuna) +
  geom_col() +
  theme_minimal() +
  guides(fill = guide_none()) +
  scale_x_continuous(expand = c(0, 0))

Aparecen visualmente de norte a sur (de arriba a abajo) porque al ordenarlas le pusimos un orden descendiente (.desc = TRUE), y ésto es necesario porque generalmente en los gráficos el origen o inicio de los ejes es en 1 y el valor de la variable aumenta a medida que se aleja del origen.

Fecha de publicación:
June 25, 2025
Extensión:
7 minute read, 1360 words
Tags:
mapas Chile
Ver también:
Primera reunión: grupo de usuari@s de R, Santiago de Chile
App: Suicidios en Chile (2017-2024) desde una perspectiva de género
Redactar textos basados en datos automáticamente con R: describiendo resultados del censo de población