La región tropical y subtropical del planeta se caracteriza por su clima cálido y una biodiversidad excepcional. La zona tropical se extiende aproximadamente entre los 23.5° N y 23.5° S de latitud, donde se encuentran las condiciones climáticas más cálidas, con temperaturas medias anuales superiores a los 18 °C. Esta región incluye biomas como las selvas tropicales, sabanas y zonas costeras, que albergan una variedad impresionante de flora y fauna.

Por otro lado, la región subtropical, que se ubica entre los trópicos y los 40° N y S, presenta un clima más variable, con inviernos frescos y veranos cálidos. Esta zona incluye ecosistemas como los desiertos, bosques mediterráneos y praderas.

Elaborar el mapa base del mundo

Lo primero que necesitamos es instalar las paqueterías con las que trabajaremos (en caso de que no las tengas): install.packages(“ggplot2”), install.packages(“maps”)

Cargar las paquterías previamente intaladas

Ahora solo es cargar las paqueterías

library(ggplot2)
library(maps)

Obtener la base de datos de los paises

con la función “map_data” vamos a obtener la base de datos de la región que nos interesa, en este caso lo haremos del mundo entero.

# Obtener datos de los mapas de países
world <- map_data("world")

Si vemos el objeto que recien creamos veremos de cuales columnas estpa conformado:

# Ver las primeras líneas de la base de datos
head(world)
##        long      lat group order region subregion
## 1 -69.89912 12.45200     1     1  Aruba      <NA>
## 2 -69.89571 12.42300     1     2  Aruba      <NA>
## 3 -69.94219 12.43853     1     3  Aruba      <NA>
## 4 -70.00415 12.50049     1     4  Aruba      <NA>
## 5 -70.06612 12.54697     1     5  Aruba      <NA>
## 6 -70.05088 12.59707     1     6  Aruba      <NA>

Los datos más importantes serán “long” y “lat” a partir de los cuales se alimenta el mapa

Mapa

Como ya generamos el objeto “world” ya podemos hacer una prueba a ver como se ve:

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black")

Si se fijan con estas simples líneas ya tenemos un mapa base, sin embargo le hace falta mucho diseño y aún no muestra nuestro objetivo final, el cual es que nos muestre la región tropical y subtropical del planeta.

Zona tropical

Ahora vamos a crear un objeto para delimitar la latitud norte y sur de la zona tropical, tu pueden enfocarte a otros límites que te interesen pero para fines de este ejercicio usaremos -23.43691 y 23.43691 que es donde se encuentran los trópicos de cancer y capricornio.

Ahora utilizaremos la función “geom_rect” para generar un rectángulo que rellene la zona tropical

# Mapa base del mundo
ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180,      #Límite izquierdo del rectángulo
                xmax = 180,       #Límite derecho del rectángulo
                ymin = -23.43691, #Límite superior del rectángulo
                ymax = 23.43691), #Límite inferior del rectángulo
            fill = "blue", #Color del relleno
            alpha = 0.2)    #Transparencia

En este caso dejaremos los límites x en -180 y 180 porque queremos que cubran todo el mundo de orilla a orilla

Si en vez de una área sombreada queremos agregar unas líneas horizontales para delimitar la zona tropical podemos utilizar la función “geom_hline”.

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_hline(yintercept = -23.43691, linetype= "dashed")+  #Límite superior de la zona tropical
  geom_hline(yintercept = 23.43691, linetype= "dashed")    #Límite inferior de la zona tropical

Puedes cambiar el tipo de línea cambiando la función “linetype” y agregar “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash”, “1F”, “F1”, “4C88C488”, “12345678” etc. dependiendo el tipo de línea.

Zona subtropical

Ahora agregaremos la zona subtropical siguiendo los mismos pasos de antes. Solo que ahora serán dos rectángulos los que necesitamos agregar, uno al norte y otro al sur. Para este ejemplo definimos que la zona subtropical va de los trópicos 23.43691 hasta la latitud 40

# Crear el gráfico
ggplot() +
  # Mapa base del mundo
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  
  # Región tropical (sombreada en verde)
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "green", alpha = 0.2) +
  
  # Regiones subtropicales (sombreada en amarillo)
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "yellow", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "yellow", alpha = 0.2)

Al igual que ántes podemos jugar con los colores para obtener el resultado deseado

ggplot() +
  # Mapa base del mundo
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  
  # Región tropical 
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  
  # Regiones subtropicales 
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2)+
  geom_hline(yintercept = -23.43691, linetype= "dashed")+  
  geom_hline(yintercept = 23.43691, linetype= "dashed")+
  geom_hline(yintercept = -40, linetype= "dashed")+  
  geom_hline(yintercept = 40, linetype= "dashed")

Ya tenemos lo más básico ahora necesitamos trabajar el diseño.

Diseño

Temas predefinidos de diseño

Existen algunos temas que podemos probar para un diseño rápido.

Con la función: theme_bw()

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2)+
  theme_bw()

Con la función: theme_linedraw()

 ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2)+ 
  theme_linedraw()

Con la función: theme_light()

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2) + 
  theme_light()

Con la función: theme_dark()

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2) +
  theme_dark()

Con la función: theme_minimal()

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2) + 
  theme_minimal()

Con la función: theme_classic()

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2)+ 
  theme_classic()

Con la función: theme_void()

ggplot() +
  geom_polygon(data = world, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -23.43691, ymax = 23.43691),
            fill = "red", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = -40, ymax = -23.43691),
            fill = "orange", alpha = 0.2) +
  geom_rect(aes(xmin = -180, xmax = 180, ymin = 40, ymax = 23.43691),
            fill = "orange", alpha = 0.2) + 
  theme_void()

Para fines de este ejemplo utilizaremos “theme_void()”

Más diseño

# Cargar paquetes
# Cargar paquetes
library(ggplot2)
library(maps)

# Obtener datos de los mapas de países
world <- map_data("world")

# Definir latitudes para las regiones tropicales y subtropicales
tropic_lat <- c(-23.43691, 23.43691)
subtropic_lat <- c(-40, 40)

# Crear el gráfico con fondo transparente y sin márgenes
ggplot() +
  # Mapa base del mundo
  geom_polygon(data = world, aes(x = long, y = lat, group = group),
               fill = "#d9d9d9", color = "#bdbdbd", size = 0.3) +  # Bordes claros
  
  # Región tropical (verde suave)
  geom_rect(aes(xmin = -180, xmax = 180, ymin = tropic_lat[1], ymax = tropic_lat[2], fill = "Tropical"),
            alpha = 0.6) +  # Verde suave con mayor transparencia
  
  # Regiones subtropicales (azul suave)
  geom_rect(aes(xmin = -180, xmax = 180, ymin = subtropic_lat[1], ymax = tropic_lat[1], fill = "Subtropical"),
            alpha = 0.4) +  # Azul suave
  geom_rect(aes(xmin = -180, xmax = 180, ymin = tropic_lat[2], ymax = subtropic_lat[2], fill = "Subtropical"),
            alpha = 0.4) +  # Azul suave
  
  # Tema sin fondo y sin márgenes
  theme_void() +
  
  # Personalizar títulos
  labs(title = "Ejemplo de mapa en R",
       subtitle = "Región Tropical y Subtropical",
       fill = "Región",  # Etiqueta de la leyenda
       caption = "") +
  
  # Escalas y proporciones, incluyendo la Antártida
  scale_x_continuous(breaks = seq(-180, 180, by = 60), limits = c(-180, 180)) +
  scale_y_continuous(breaks = seq(-90, 90, by = 30), limits = c(-90, 90)) +
  
  # Mantener proporciones geográficas correctas
  #Esta función se utiliza para fijar la relación de aspecto del gráfico
  coord_fixed(ratio = 1) +
  
  # Personalizar la escala de colores de la leyenda
  scale_fill_manual(values = c("Tropical" = "#a1d99b", "Subtropical" = "#9ecae1"))+
  
  #Agregar el ecuador
    geom_hline(yintercept = 0, linetype= "dashed", colour = "black" )  
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Mapa del continente americano

Si en vez del mundo quieres trabajar con otra región del mundo solo debes especificarlo al inicio y cambiar los márgenes o límites del mapa. Por ejemplo realicemos un ejemplo para el continente americano

# Obtener los datos de los mapas de los países
world <- map_data("world")

# Filtrar solo los las coordenadas de los países del continente americano
americas <- subset(world, long >= -180 & long <= -30 & lat >= -60 & lat <= 90)

# Definir las latitudes para las regiones tropicales y subtropicales
tropic_lat <- c(-23.43691, 23.43691)
subtropic_lat <- c(-40, 40)

# Crear el gráfico del continente americano con sombreado de zonas tropicales y subtropicales
ggplot() +
  # Mapa base de América (incluyendo Alaska y sin cortes)
  geom_polygon(data = americas, aes(x = long, y = lat, group = group),
               fill = "#d9d9d9", color = "#bdbdbd", size = 0.3) +  # Bordes claros
  
  # Región tropical (verde suave)
  geom_rect(aes(xmin = -180, xmax = -30, ymin = tropic_lat[1], ymax = tropic_lat[2], fill = "Tropical"),
            alpha = 0.6) +  # Verde suave con mayor transparencia
  
  # Regiones subtropicales (azul suave)
  geom_rect(aes(xmin = -180, xmax = -30, ymin = subtropic_lat[1], ymax = tropic_lat[1], fill = "Subtropical"),
            alpha = 0.4) +  # Azul suave en la parte sur
  geom_rect(aes(xmin = -180, xmax = -30, ymin = tropic_lat[2], ymax = subtropic_lat[2], fill = "Subtropical"),
            alpha = 0.4) +  # Azul suave en la parte norte
  
  # Tema sin fondo y sin márgenes
  theme_void() +
  
  # Personalizar títulos
  labs(title = "Ejemplo de mapa en R",
       subtitle = "Región Tropical y Subtropical",
       fill = "Región",  # Etiqueta de la leyenda
       caption = "") +
  
  # Ajustes de texto
  theme(
    plot.title = element_text(size = 20, face = "bold", hjust = 0.5, family = "sans", color = "#4d4d4d"),
    plot.subtitle = element_text(size = 14, hjust = 0.5, family = "sans", color = "#6d6d6d"),
    plot.caption = element_text(size = 10, hjust = 0.5, family = "sans", color = "#808080"),
    plot.background = element_rect(fill = NA, color = NA),  # Fondo transparente
    panel.background = element_rect(fill = NA, color = NA),  # Fondo del panel transparente
    panel.border = element_blank(),  # Sin bordes en el panel
    plot.margin = margin(0, 0, 0, 0),  # Sin márgenes
    axis.text = element_blank(),  # Sin texto en los ejes
    axis.title = element_blank()  # Sin títulos en los ejes
  ) +
  
  # Escalas y proporciones para América, incluyendo Alaska
  scale_x_continuous(breaks = seq(-180, -30, by = 30), limits = c(-180, -30)) +
  scale_y_continuous(breaks = seq(-60, 90, by = 30), limits = c(-60, 90)) +
  
  # Agregar el ecuador
  geom_hline(yintercept = 0, linetype = "dashed", colour = "black") +
  
  # Mantener proporciones geográficas correctas
  coord_fixed(ratio = 1) +
  
  # Personalizar la escala de colores de la leyenda
  scale_fill_manual(values = c("Tropical" = "#a1d99b", "Subtropical" = "#9ecae1"))

Más ejemplos de otros usos

La ventaja de R es que tiene un universo casi infinito de diferentes posibilidades que puedes usar para crear mapas increíbles e incluso interactivos. Aquí te dejamos un ejemplo para que motives tu creatividad.

# Cargar los paquetes necesarios
library(leaflet)
library(sf)
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(rnaturalearth)
library(rnaturalearthdata)
## 
## Attaching package: 'rnaturalearthdata'
## The following object is masked from 'package:rnaturalearth':
## 
##     countries110
library(leaflet.extras)  # Cargar el paquete para componentes extras

# Cargar los datos del mapa mundial y convertir a formato sf (simple features)
world <- ne_countries(scale = "medium", returnclass = "sf")

# Crear las regiones tropicales y subtropicales como objetos sf (rectángulos)
tropic_region <- st_as_sfc(st_bbox(c(xmin = -360, xmax = 360, ymin = -23.43691, ymax = 23.43691)))  # Toda la región tropical
subtropic_region_north <- st_as_sfc(st_bbox(c(xmin = -360, xmax = 360, ymin = 23.43691, ymax = 40)))  # Región subtropical norte
subtropic_region_south <- st_as_sfc(st_bbox(c(xmin = -360, xmax = 360, ymin = -40, ymax = -23.43691)))  # Región subtropical sur

# Crear un mapa interactivo con leaflet
leaflet() %>%
  # Añadir los límites de los países del mundo
  addPolygons(data = world, color = "#444444", weight = 1, fillColor = "#f0f0f0", fillOpacity = 0.5, group = "Límites de países") %>%
  
  # Sombrear la región tropical (verde)
  addPolygons(data = tropic_region, fillColor = "#66c2a5", fillOpacity = 0.3, weight = 0, group = "Región Tropical") %>%
  
  # Sombrear la región subtropical al norte (azul claro)
  addPolygons(data = subtropic_region_north, fillColor = "#8da0cb", fillOpacity = 0.3, weight = 0, group = "Región Subtropical Norte") %>%
  
  # Sombrear la región subtropical al sur (azul claro)
  addPolygons(data = subtropic_region_south, fillColor = "#8da0cb", fillOpacity = 0.3, weight = 0, group = "Región Subtropical Sur") %>%
  
  # Añadir un relieve de terreno (capa base de Esri)
  addProviderTiles(providers$Esri.WorldImagery, group = "Mapa de Terreno") %>%
  
  # Añadir capas de control para permitir que el usuario seleccione qué mostrar
  addLayersControl(
    baseGroups = c("Mapa de Terreno"),
    overlayGroups = c("Límites de países", "Región Tropical", "Región Subtropical Norte", "Región Subtropical Sur"),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  
  # Añadir escala
  addScaleBar(position = "bottomleft", options = scaleBarOptions(maxWidth = 200, metric = TRUE)) %>%
  
  # Añadir una vista inicial centrada en el mundo
  setView(lng = 0, lat = 0, zoom = 2) %>%
  
  # Añadir mini mapa
  addMiniMap(toggleDisplay = TRUE, position = "bottomright") %>%
  
  # Añadir etiquetas y zoom
  addTiles()  # Fondo interactivo por defecto