1 Introducción

La caña de azúcar (Saccharum officinarum), una de las plantas más importantes en la economía agrícola global, tiene sus orígenes en el sudeste asiático, específicamente en Nueva Guinea y áreas circundantes, donde comenzó a cultivarse hace más de 8,000 años (Galloway 2005). Las poblaciones indígenas de esta región fueron las primeras en domesticarla, aprovechando su dulzura natural para masticarla y obtener energía rápida. A medida que se extendió el cultivo, esta planta fue llevada por rutas comerciales hacia la India y otros países del sur de Asia, donde fue adaptada a diferentes climas y su cultivo se perfeccionó. En la India, se desarrollaron técnicas de extracción y cristalización del azúcar, lo cual impulsó aún más su valor y llevó a que se integrara en la cultura y economía de muchas civilizaciones antiguas (Galloway 2005).

Con el paso de los siglos, la caña de azúcar se expandió hacia otras partes del mundo gracias a las rutas de comercio y exploración. Los árabes fueron responsables de introducirla en el Mediterráneo y el norte de África, y con la llegada de los europeos a América (Galloway 2005), la planta fue llevada al Nuevo Mundo, especialmente a las zonas del Caribe y América Latina, donde el clima era ideal para su cultivo masivo. En estos nuevos territorios, la producción de caña de azúcar creció exponencialmente (Galloway 2005), impulsada por la mano de obra esclava y el comercio transatlántico, convirtiéndose en un pilar económico de las colonias. Hoy en día, la caña de azúcar es cultivada en todo el mundo y continúa siendo esencial tanto para la producción de azúcar como para la generación de biocombustibles y otros derivados industriales (Galloway 2005).

2 Problema

Los agricultores de la caña de azúcar desean saber cuales son las áreas en el planeta donde existe un clima adecuado para la siembra de la caña de azúcar. El conocimiento que se tiene sobre las condiciones climáticas para la siembra de caña en cuanto a temperatura y precipitación son las siguientes:

  • Temperatura media entre 22,5°C y 28°C
  • Precipitación anual entre 1500 y 3500 milímetros, o precipitación mensual entre 125 y 290 milímetros.

A partir de esta información se debe resolver los siguientes planteamientos:

  • Utilizando los datos de clima de línea base a nivel global, genere un código en R que permita construir mapas de aptitud en términos climáticos para la caña de azúcar (con base en los rangos óptimos). Grafique los mapas con una escala de colores adecuada.
  • Identifique 2 o 3 países con áreas de alto potencial para la caña de azúcar y realice un corte para estas zonas con el shape global. Grafique los mapas con una escala de colores adecuada.
  • Identificar algunos puntos (2 o 3) al azar en la región del Valle del Cauca (use google maps) y extraer la información de clima. Grafique las series de tiempo de temperatura y precipitación.
  • Por medio de alguna métrica de similaridad (ejemplo: distancia euclidiana) genere un código en R que permita identificar mapas de similaridad a nivel global para los sitios identificados en 3. Grafique los mapas con una escala de colores adecuada. Compare los mapas generados por ambas aproximaciones y concluya.

3 Análisis

3.1 Origen de datos

El origen de los datos climáticos empleados en este análisis fue la base de datos WorldClim (Cerasoli, D’Alessandro, and Biondi 2022), la cual es ampliamente reconocida por proporcionar información climática de alta resolución, adecuada para aplicaciones en ecología, biodiversidad y modelamiento de hábitats, entre otros campos relacionados con el estudio de los sistemas naturales y sus dinámicas. Esta base de datos fue desarrollada con el objetivo de poner a disposición de la comunidad científica global un conjunto consistente de datos que permitiera la realización de análisis comparativos y proyectivos en distintas áreas de investigación ambiental (Cerasoli, D’Alessandro, and Biondi 2022).

Para el presente análisis, se emplearon climatologías que representan promedios históricos construidos a partir de datos recopilados entre los años 1970 y 2000 (Cerasoli, D’Alessandro, and Biondi 2022), lo que ofrece una visión representativa de las condiciones climáticas de fines del siglo XX. Específicamente, se utilizaron datos de temperatura promedio y precipitación total a nivel global, con una resolución espacial de 10 minutos de arco, lo cual equivale a una superficie aproximada de 340 \(km^2\) por pixel (Cerasoli, D’Alessandro, and Biondi 2022). Esta resolución espacial permite un nivel de detalle que resulta útil tanto para análisis a escalas regionales como globales, brindando una base sólida para la modelación de patrones climáticos y sus efectos en la distribución de especies biológicas en este caso la caña de azucar (Saccharum officinarum).

La metodología empleada en WorldClim (Cerasoli, D’Alessandro, and Biondi 2022) para la creación de estas capas de datos incluye la interpolación de datos provenientes de estaciones meteorológicas de todo el mundo, combinando técnicas estadísticas y algoritmos de interpolación espacial para generar mapas climáticos continuos y homogéneos.

3.2 Temperatura promedio y precipitación promedio mensual

La temperatura promedio y la precipitación promedio mensual fueron calculadas para todo el planeta.

# Cargar las librerías necesarias
library(sf)
library(ggplot2)
library(raster)
library(cowplot)

paises <- sf::read_sf("./ne_10m_admin_0_countries/ne_10m_admin_0_countries.shp")
path1 <- "./wc2.1_10m_tavg/"

Temp <- list.files(path1, pattern = "*.tif$", full.names = TRUE)
Temp_rasters <- raster::stack(Temp)

Temp_mean <- calc(Temp_rasters, fun = mean)


Temp_mean_df <- as.data.frame(Temp_mean, xy = TRUE, na.rm = TRUE)
colnames(Temp_mean_df) <- c("x", "y", "value")


path2 <- "./wc2.1_10m_prec/"

Prec <- list.files(path2, pattern = "*.tif$", full.names = TRUE)
Prec_rasters <- raster::stack(Prec)

Prec_sum <- calc(Prec_rasters, fun = mean)


Prec_sum_df <- as.data.frame(Prec_sum, xy = TRUE, na.rm = TRUE)
colnames(Prec_sum_df) <- c("x", "y", "value")


mapa1<-ggplot() +
  
   geom_raster(data = Temp_mean_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +   
scale_fill_gradient2(name = "(°C)", 
                       low = "#2c7bb6", mid = "#ffffbf", high = "#d7191c",  
                       midpoint = 15,           
                       limits = c(-10, 40),     
                       oob = scales::squish) + 
  labs(title = "Temperatura Promedio") +
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


mapa2<-ggplot() +
  geom_raster(data = Prec_sum_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +   
                       scale_fill_gradient2(name = "(mm)", 
                       low = "#eff3ff", mid = "#6baed6", high = "#2171b5", 
                       midpoint = 466,           
                       limits = c(0, 932),     
                       oob = scales::squish) + 
  labs(title = "Precipitación Promedio Mensual") +
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


plot_grid(mapa1, mapa2, ncol = 1)

La temperatura promedio se calculó a partir de las climatologías promedio de cada uno de los meses de los años 1970 a 2000, cuyas unidades son \(°C\). Con este calculo se obtuvo una capa raster de la temperatura promedio global que muestra un patrón esperado con tendencia al aumento de la temperatura en los trópicos y las zonas bajas del planeta.

library(rasterVis)
library(RColorBrewer)

# Definir una paleta de colores personalizada con los códigos de color proporcionados
custom_palette <- c("#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", 
                   "#fee090", "#fdae61", "#f46d43", "#d73027")

# Aplicar la paleta personalizada en el tema de raster
mytheme <- rasterTheme(region = custom_palette)

# Crear el gráfico utilizando la paleta de colores personalizada
levelplot(Temp_mean, par.settings = mytheme, main = "Temperatura promedio")

La precipitación promedio mensual se calculó a partir de las climatologías promedio de cada uno de los meses de los años 1970 a 2000 y posteriormente se calculó el promedio total de todos los meses obteniendo una precipitación promedio mensual total. Las unidades para esta variable son \(mm\) totales de precipitación mensual. Con este calculo se obtuvo una capa raster de la precipitación promedio mensual global que muestra un patrón esperado con tendencia al aumento de esta precipitación en los trópicos y en algunas zonas costeras en norte y Suramérica, en la peninsula Escandinava y Nueva Zelanda.

library(rasterVis)
library(RColorBrewer)

# Definir una paleta de colores personalizada con los códigos de color proporcionados
custom_palette <- c("#f7fbff", "#deebf7", "#c6dbef", "#9ecae1", "#6baed6", 
                    "#4292c6", "#2171b5", "#08519c", "#08306b")

# Aplicar la paleta personalizada en el tema de raster
mytheme <- rasterTheme(region = custom_palette)

# Crear el gráfico utilizando la paleta de colores personalizada
levelplot(Prec_sum, par.settings = mytheme, main = "Precipitación promedio mensual")

3.3 Zonas adecuadas para la siembra de caña de azucar (Saccharum officinarum)

El mapa muestra una distribución global de áreas con temperaturas adecuadas para el cultivo de caña de azúcar. En el mapa, los colores representan un rango de temperaturas en grados Celsius (°C), que van desde 23°C hasta 28°C, como se indica en la escala de colores a la derecha. Las áreas en tonos rojos y anaranjados representan regiones con temperaturas más altas (cercanas a 28°C), mientras que las zonas en tonos azules representan temperaturas más bajas dentro del rango adecuado (cercanas a 23°C).

La distribución de colores sugiere que las áreas con temperaturas óptimas para el cultivo de caña están ubicadas principalmente en zonas tropicales y subtropicales. Entre las regiones destacadas están partes de América del Sur (particularmente Brasil), África central y occidental, el sur de Asia (incluyendo India y el sudeste asiático), así como el norte de Australia.

# Cargar las librerías necesarias
library(sf)
library(ggplot2)
library(raster)
library(cowplot)


temperatura_adecuada<-calc(Temp_mean, fun = function(x) {
  x[x < 22.5 | x > 28] <- NA  # Asigna NA a valores fuera del rango
  return(x)
})
temperatura_adecuada_df <- as.data.frame(temperatura_adecuada, xy = TRUE, na.rm = TRUE)
colnames(temperatura_adecuada_df) <- c("x", "y", "value")



ggplot() +
  
  geom_raster(data = temperatura_adecuada_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +   
                       scale_fill_gradient2(name = "(°C)", 
                       low = "#2c7bb6", mid = "#ffffbf", high = "#d7191c", 
                       midpoint = 25,           
                       limits = c(22.5, 28),     
                       oob = scales::squish) + 
  labs(title = "Temperatura adecuada para sembrar caña") +
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

El siguiente mapa muestra la distribución global de áreas con niveles de precipitación adecuados para el cultivo de caña de azúcar. La leyenda a la derecha indica que la precipitación en estas áreas presentan un rango que va de 160 mm a 280 mm. Los tonos más oscuros de azul representan regiones con mayores niveles de precipitación (cercanos a 280 mm), mientras que los tonos más claros indican zonas con menor precipitación dentro del rango adecuado (alrededor de 160 mm).

Las áreas con precipitaciones óptimas para el cultivo de caña se encuentran principalmente en regiones tropicales y subtropicales. En particular, destacan áreas de América del Sur (especialmente en la región amazónica de Brasil y partes de los Andes), el sudeste asiático (incluyendo zonas de Indonesia y Filipinas) y algunas partes del centro y este de África.

# Cargar las librerías necesarias
library(sf)
library(ggplot2)
library(raster)
library(cowplot)

precipitacion_adecuada<-calc(Prec_sum, fun = function(x) {
  x[x < 125 | x > 290] <- NA  # Asigna NA a valores fuera del rango
  return(x)
})
precipitacion_adecuada_df <- as.data.frame(precipitacion_adecuada, xy = TRUE, na.rm = TRUE)
colnames(precipitacion_adecuada_df) <- c("x", "y", "value")




ggplot() +
  geom_raster(data = precipitacion_adecuada_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +   
                       scale_fill_gradient2(name = "(mm)", 
                        low = "#eff3ff", mid = "#6baed6", high = "#2171b5", 
                       midpoint = 207,           
                       limits = c(125, 290),    
                       oob = scales::squish) + 
  labs(title = "Precipitación adecuada para sembrar caña") +
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

Para delimitar las áreas donde la temperatura y las precipitaciones coinciden para el cultivo de caña, se transformaron los datos raster de ambas variables a un formato vectorial con una geometría de polígono. Este procedimiento permitirá realizar un geoprocesamiento donde se obtenga el área global final donde ambas variables coinciden para que la siembra de la caña sea la adecuada.

El siguiente mapa destaca en rojo las zonas con condiciones climáticas adecuadas para el cultivo de caña de azúcar: el mapa superior indica áreas con temperaturas favorables, mientras que el inferior muestra las zonas con niveles de precipitación adecuados. Ambos mapas señalan principalmente regiones tropicales y subtropicales, incluyendo partes de América del Sur (especialmente en Brasil y el Amazonas), el norte de África, el sur y sureste de Asia, así como áreas de Oceanía, lo que sugiere que estas zonas cumplen con los requisitos de temperatura y humedad necesarios para el cultivo de caña.

# Cargar las librerías necesarias
library(sf)
library(ggplot2)
library(raster)
library(cowplot)


temperatura_zona<-calc(temperatura_adecuada, fun = function(x) {
  x[x >= 22.5 | x <= 28] <- 1  # Asigna NA a valores fuera del rango
  return(x)
})
temperatura_zona_poly <- rasterToPolygons(temperatura_zona, dissolve = TRUE)
temperatura_zona_poly <-st_as_sf(temperatura_zona_poly)

temperatura_zona_df <- as.data.frame(temperatura_zona, xy = TRUE, na.rm = TRUE)
colnames(temperatura_zona_df) <- c("x", "y", "value")


precipitacion_zona<-calc(precipitacion_adecuada, fun = function(x) {
  x[x >= 125 | x <= 290] <- 1  # Asigna NA a valores fuera del rango
  return(x)
})
precipitacion_zona_poly <- rasterToPolygons(precipitacion_zona, dissolve = TRUE)
precipitacion_zona_poly <-st_as_sf(precipitacion_zona_poly)

precipitacion_zona_df <- as.data.frame(precipitacion_zona, xy = TRUE, na.rm = TRUE)
colnames(precipitacion_zona_df) <- c("x", "y", "value")


mapa1<-ggplot() +
  geom_sf(data = temperatura_zona_poly, fill = "red", color = "gray30") + 
  #geom_raster(data = temperatura_zona_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +   
                         labs(title = "Zonas con temperaturas adecuadas") +
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


mapa2<-ggplot() +
  geom_sf(data = precipitacion_zona_poly, fill = "red", color = "gray30") +
  #geom_raster(data = precipitacion_zona_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +   
                       
  labs(title = "Zonas con precipitaciones adecuadas") +
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


plot_grid(mapa1, mapa2, ncol = 1)

La zona final dónde coinciden las áreas con las temperaturas y precipitaciones optimas se obtuvieron a partir de geoprocesamiento superponiendo ambas capas para estas dos variables.

El siguiente mapa muestra en color rojo las zonas del mundo que poseen condiciones climáticas adecuadas para el cultivo de caña de azúcar, combinando tanto temperatura como precipitación óptimas. Estas áreas se concentran principalmente en regiones tropicales y subtropicales, destacando América del Sur (especialmente la cuenca amazónica en Colombia, Ecuador, Perú y Brasil), el centro de África, y el sudeste asiático, incluyendo países como Indonesia, Malasia y Filipinas. La distribución sugiere que las zonas con alta humedad y temperaturas cálidas constantes son ideales para este tipo de cultivo.

zonatotal<-temperatura_zona+precipitacion_zona

zonatotal_cal<-calc(zonatotal, fun = function(x) {
  x[x < 2 | x >2 ] <- NA  # Asigna NA a valores fuera del rango
  return(x)
})

zonatotal_cal_poly <- rasterToPolygons(zonatotal_cal, dissolve = TRUE)
zonatotal_cal_poly <-st_as_sf(zonatotal_cal_poly)


ggplot() +
  geom_sf(data = zonatotal_cal_poly, fill = "red", color = "gray30") + 
#  geom_raster(data = zonatotal_cal_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +       
                         labs(title = "Zonas adecuadas para el cultivo de caña") +
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

4 Análisis por países

4.1 Colombia

La siguiente imagen presenta dos mapas de Colombia que indican las zonas climáticamente adecuadas para el cultivo de caña de azúcar en términos de temperatura y precipitación. El mapa de la izquierda muestra las áreas con temperaturas óptimas (22°C a 28°C), destacando las regiones orientales y amazónicas en tonos rojos. El mapa de la derecha muestra las zonas con niveles de precipitación favorables (160 mm a 280 mm), concentradas en azul oscuro en la región Pacífica y suroccidente del país. Estos mapas identifican las áreas de Colombia con condiciones ideales para el cultivo de caña, combinando factores de temperatura y humedad.

library(dplyr)
colombia<-paises%>%
  filter(ADMIN == "Colombia")


colombia_raster<-raster::mask(zonatotal_cal, colombia)
colombia_poly <- rasterToPolygons(colombia_raster, dissolve = TRUE)
colombia_poly <-st_as_sf(colombia_poly)


colombia_temp<-raster::mask(Temp_mean, colombia_poly)
colombia_temp_df <- as.data.frame(colombia_temp, xy = TRUE, na.rm = TRUE)
colnames(colombia_temp_df) <- c("x", "y", "value")

colombia_prec<-raster::mask(Prec_sum, colombia_poly)
colombia_prec_df <- as.data.frame(colombia_prec, xy = TRUE, na.rm = TRUE)
colnames(colombia_prec_df) <- c("x", "y", "value")


mapa1<-ggplot() +
  geom_sf(data = colombia_poly, fill = NA, color = "gray30") +  
 geom_raster(data = colombia_temp_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = colombia, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-85, -65,2)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-5, 13, 2), limits = c(-5, 13)) +      
                         labs(title = "Temperatura en las zonas adecuadas para el cultivo de caña") +
  scale_fill_gradient2(name = "(°C)", 
                       low = "#2c7bb6", mid = "#ffffbf", high = "#d7191c", 
                       midpoint = 25,           
                       limits = c(22, 28),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

mapa2<-ggplot() +
  geom_sf(data = colombia_poly, fill = NA, color = "gray30") +  
 geom_raster(data = colombia_prec_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = colombia, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-85, -65,2)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-5, 13, 2), limits = c(-5, 13)) +      
                         labs(title = "Precipitaciones en las zonas adecuadas para el cultivo de caña") +
  scale_fill_gradient2(name = "(mm)", 
                        low = "#eff3ff", mid = "#6baed6", high = "#2171b5", 
                        midpoint = 207,           
                       limits = c(125, 290),      
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


plot_grid(mapa1, mapa2, ncol = 2)

4.2 Brasil

La siguiente imagen muestra dos mapas de Brasil que destacan las zonas adecuadas para el cultivo de caña de azúcar en función de la temperatura y la precipitación. El mapa de la izquierda presenta las áreas con temperaturas favorables (22°C a 28°C), resaltando en tonos rojos y anaranjados las zonas más cálidas, especialmente en el norte y centro del país. El mapa de la derecha muestra las regiones con niveles de precipitación adecuados (160 mm a 280 mm), donde los tonos azules representan las áreas con mayor precipitación, ubicadas principalmente en el norte de Brasil.

library(dplyr)
brasil<-paises%>%
  filter(ADMIN == "Brazil")

brasil_raster<-raster::mask(zonatotal_cal, brasil)
brasil_poly <- rasterToPolygons(brasil_raster, dissolve = TRUE)
brasil_poly <-st_as_sf(brasil_poly)


brasil_temp<-raster::mask(Temp_mean, brasil_poly)
brasil_temp_df <- as.data.frame(brasil_temp, xy = TRUE, na.rm = TRUE)
colnames(brasil_temp_df) <- c("x", "y", "value")

brasil_prec<-raster::mask(Prec_sum, brasil_poly)
brasil_prec_df <- as.data.frame(brasil_prec, xy = TRUE, na.rm = TRUE)
colnames(brasil_prec_df) <- c("x", "y", "value")


mapa1<-ggplot() +
  geom_sf(data = brasil_poly, fill = NA, color = "gray30") +  
 geom_raster(data = brasil_temp_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = brasil, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
   scale_x_continuous(name = "Longitud", breaks = seq(-77, -34,5), limits = c(-77, -34)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-35, 6, 5), limits = c(-35, 6)) +       
                         labs(title = "Temperatura en las zonas adecuadas para el cultivo de caña") +
  scale_fill_gradient2(name = "(°C)", 
                       low = "#2c7bb6", mid = "#ffffbf", high = "#d7191c", 
                       midpoint = 25,           
                       limits = c(22, 28),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

mapa2<-ggplot() +
  geom_sf(data = brasil_poly, fill = NA, color = "gray30") +  
 geom_raster(data = brasil_prec_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = brasil, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
   scale_x_continuous(name = "Longitud", breaks = seq(-77, -34,5), limits = c(-77, -34)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-35, 6, 5), limits = c(-35, 6)) +      
                         labs(title = "Precipitaciones en las zonas adecuadas para el cultivo de caña") +
  scale_fill_gradient2(name = "(mm)", 
                        low = "#eff3ff", mid = "#6baed6", high = "#2171b5", 
                        midpoint = 207,           
                       limits = c(125, 290),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


plot_grid(mapa1, mapa2, ncol = 2)

4.3 República Democrática del Congo

La siguiente imagen presenta dos mapas de la República Democrática del Congo que destacan las zonas adecuadas para el cultivo de caña de azúcar, según la temperatura y la precipitación. El mapa de la izquierda muestra en tonos de amarillo a rojo las áreas con temperaturas óptimas (22°C a 28°C), con zonas cálidas concentradas en el suroeste del país. El mapa de la derecha utiliza una escala de azul para ilustrar las áreas con precipitaciones adecuadas (160 mm a 280 mm), distribuidas principalmente en el norte y centro del país.

library(dplyr)
congo<-paises%>%
  filter(ADMIN == "Democratic Republic of the Congo")


congo_raster<-raster::mask(zonatotal_cal, congo)
congo_poly <- rasterToPolygons(congo_raster, dissolve = TRUE)
congo_poly <-st_as_sf(congo_poly)


congo_temp<-raster::mask(Temp_mean, congo_poly)
congo_temp_df <- as.data.frame(congo_temp, xy = TRUE, na.rm = TRUE)
colnames(congo_temp_df) <- c("x", "y", "value")

congo_prec<-raster::mask(Prec_sum, congo_poly)
congo_prec_df <- as.data.frame(congo_prec, xy = TRUE, na.rm = TRUE)
colnames(congo_prec_df) <- c("x", "y", "value")


mapa1<-ggplot() +
  geom_sf(data = congo_poly, fill = NA, color = "gray30") +  
 geom_raster(data = congo_temp_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = congo, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(12, 32,2), limits = c(12, 32)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-14, 6, 2), limits = c(-14, 6)) +      
                         labs(title = "Temperatura en las zonas adecuadas para el cultivo de caña") +
  scale_fill_gradient2(name = "(°C)", 
                       low = "#2c7bb6", mid = "#ffffbf", high = "#d7191c", 
                       midpoint = 25,           
                       limits = c(22, 28),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

mapa2<-ggplot() +
  geom_sf(data = congo_poly, fill = NA, color = "gray30") +  
 geom_raster(data = congo_prec_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = congo, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(12, 32,2), limits = c(12, 32)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-14, 6, 2), limits = c(-14, 6)) +      
                         labs(title = "Precipitaciones en las zonas adecuadas para el cultivo de caña") +
  scale_fill_gradient2(name = "(mm)", 
                        low = "#eff3ff", mid = "#6baed6", high = "#2171b5", 
                        midpoint = 207,           
                       limits = c(125, 290),      
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


plot_grid(mapa1, mapa2, ncol = 2)

5 Análisis climático del Valle del Cauca (Colombia)

Se seleccionaron tres puntos ubicados en el norte, centro y sur de valle del río Cauca para analizar la serie de tiempo mensual y el comportamiento de estas dos variables en el cada uno de estos puntos para buscar condiciones similares alrededor del mundo.

Estos puntos tiene las siguientes coordenadas:

Tabla 1. Coordenadas seleccionadas para el análisis de series de tiempo de temperatura y precipitaciones

Punto Latitud Longitud
Punto Sur 3.24 -76.45
Punto Centro 3.91 -76.32
Punto Norte 4.31 -76.12
library(leaflet)

coord01<-c(3.24, -76.45)
coord02<-c(3.91, -76.32)
coord03<-c(4.31, -76.12)


long <- c(coord01[2],coord02[2],coord03[2])
lat <- c(coord01[1],coord02[1],coord03[1])
coordenadas <- data.frame(long,lat)


analisisFinal <- SpatialPoints(coordenadas)
proj4string(analisisFinal) <- CRS("+proj=longlat +datum=WGS84 +no_defs")


leaflet(analisisFinal) %>%
  addTiles('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}') %>%
  addMarkers(popup = "Puntos en el Valle del Cauca") %>%
  setView(lng = mean(coordenadas$lon), lat = mean(coordenadas$lat), zoom = 8)

La siguiente gráfica muestra la serie de tiempo del promedio mensual de temperatura en tres los tres puntos seleccionados (Sur, Centro y Norte) durante un año. El punto Sur (línea azul) presenta las temperaturas más altas, alcanzando casi 24°C en verano, mientras que el Norte (línea verde) tiene temperaturas intermedias, que descienden hacia finales de año. El punto Centro (línea naranja) muestra las temperaturas más bajas, alrededor de 21°C a 22°C, con poca variación estacional.

library(plotly)
Serie_1_temp <- extract(Temp_rasters,coordenadas[1,])
Serie_2_temp <- extract(Temp_rasters,coordenadas[2,])
Serie_3_temp <- extract(Temp_rasters,coordenadas[3,])

colnames(Serie_1_temp) <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")
colnames(Serie_2_temp) <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")
colnames(Serie_3_temp) <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")



# Convertir las series en data frames
df1 <- data.frame(
  Mes = as.numeric(colnames(Serie_1_temp)),
  Temperatura = as.numeric(Serie_1_temp)
)

df2 <- data.frame(
 Mes = as.numeric(colnames(Serie_1_temp)),
  Temperatura = as.numeric(Serie_2_temp)
)

df3 <- data.frame(
 Mes = as.numeric(colnames(Serie_1_temp)),
  Temperatura = as.numeric(Serie_3_temp)
)

# Crear la gráfica con las tres series de tiempo
fig <- plot_ly() %>%
  add_trace(data = df1, x = ~Mes, y = ~Temperatura, type = 'scatter', mode = 'lines+markers',
            name = "Sur") %>%
  add_trace(data = df2, x = ~Mes, y = ~Temperatura, type = 'scatter', mode = 'lines+markers',
            name = "Centro") %>%
  add_trace(data = df3, x = ~Mes, y = ~Temperatura, type = 'scatter', mode = 'lines+markers',
            name = "Norte") %>%
  layout(
    title = "Series de Tiempo del promedio de temperatura mensual",
    xaxis = list(title = "Mes"),
    yaxis = list(title = "Temperatura (°C)"),
    legend = list(orientation = "h",   # Horizontal
                  x = 0.5,             # Centrar horizontalmente
                  xanchor = "center",  # Anclar al centro
                  y = -0.2)            # Posicionar abajo del gráfico
  )

# Mostrar la gráfica
fig

La siguiente gráfica muestra las precipitaciones para los tres puntos seleccionados. El punto sur presenta los mayores valorea de precipitación que ocurren en abril y en octubre y los menores valores ocurren en agosto. Este patrón se mantienen para los puntos Centro y Norte, sin embargo los valores no oscilan de manera extrema como lo hacen en el punto Sur.

library(plotly)
Serie_1_prec <- extract(Prec_rasters,coordenadas[1,])
Serie_2_prec <- extract(Prec_rasters,coordenadas[2,])
Serie_3_prec <- extract(Prec_rasters,coordenadas[3,])

colnames(Serie_1_prec) <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")
colnames(Serie_2_prec) <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")
colnames(Serie_3_prec) <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")



# Convertir las series en data frames
df1 <- data.frame(
  Mes = as.numeric(colnames(Serie_1_prec)),
  preceratura = as.numeric(Serie_1_prec)
)

df2 <- data.frame(
 Mes = as.numeric(colnames(Serie_1_prec)),
  preceratura = as.numeric(Serie_2_prec)
)

df3 <- data.frame(
 Mes = as.numeric(colnames(Serie_1_prec)),
  preceratura = as.numeric(Serie_3_prec)
)

# Crear la gráfica con las tres series de tiempo
fig <- plot_ly() %>%
  add_trace(data = df1, x = ~Mes, y = ~preceratura, type = 'scatter', mode = 'lines+markers',
            name = "Sur") %>%
  add_trace(data = df2, x = ~Mes, y = ~preceratura, type = 'scatter', mode = 'lines+markers',
             name = "Centro") %>%
  add_trace(data = df3, x = ~Mes, y = ~preceratura, type = 'scatter', mode = 'lines+markers',
             name = "Norte") %>%
  layout(
    title = "Series de Tiempo de las precipitaciones mensuales",
    xaxis = list(title = "Mes"),
    yaxis = list(title = "Precipitación (mm)"),
    legend = list(orientation = "h",   # Horizontal
                  x = 0.5,             # Centrar horizontalmente
                  xanchor = "center",  # Anclar al centro
                  y = -0.2)            # Posicionar abajo del gráfico
  )

# Mostrar la gráfica
fig

6 Análisis de similitud ambiental

El análisis de similitud mostró que las áreas más similares a los puntos seleccionados cuyos valores de temperatura promedio anual son de 23.73 °C y cuyos valores de precipitaciones anuales promedios son de 140.33 mm, están las zonas tropicales del planeta pero específicamente en países como Brasil y La República Democrática del Congo.

# Cargar librerías necesarias
library(raster)
library(ggplot2)
library(rasterVis)

temp_target <- mean(mean(Serie_1_temp), mean(Serie_2_temp), mean(Serie_3_temp))  
prec_target <- mean(mean(Serie_1_prec), mean(Serie_2_prec), mean(Serie_3_prec)) 

distance_map <- sqrt((Temp_mean - temp_target)^2 + (Prec_sum - prec_target)^2)

similarity_map <- 1 / (1 + distance_map) 

custom_palette <- c(  "#4d4d4d", "#999999", 
                   "#e0e0e0", "#ffffbf", "#fddbc7", "#ef8a62", "#b2182b")
mytheme <- rasterTheme(region = custom_palette)

# Visualizar el mapa de similitud
levelplot(similarity_map, 
          main = "Mapa de Similitud Basado en Distancia Euclidiana",
          par.settings = mytheme, 
          xlab = "Longitud", ylab = "Latitud")

Analizando el mapa de silimitudes se puede observar que las áreas más similares a los puntos seleccionados en Colombia son muy pocas y se resalta que los tres puntos seleccionados estuvieron representados en el mapa. Las zonas con mayor similaridad en cuanto a la temperatura y a la precipitación de los puntos seleccionados del Valle de Cauca están en su mayor extensión en la RD del Congo y en algunas zonas de Brasil.

area_similares<-calc(similarity_map, fun = function(x){
  x[x<0.3]<-NA
  return(x)
})


area_similares_df <- as.data.frame(area_similares, xy = TRUE, na.rm = TRUE)
colnames(area_similares_df) <- c("x", "y", "value")



mapa1<-ggplot() +
  
  geom_tile(data = area_similares_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30)) +   
                         labs(title = "") +
   scale_fill_gradient2(name = "Similitud", 
                       low = "#ffffffff", 
                       mid = "#a50f15", 
                       high = "#67000d", 
                       midpoint = 0.5,           
                       limits = c(0, 1),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),                              
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

mapa2<-ggplot() +
  
  geom_tile(data = area_similares_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30), limits = c(-85, -65)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30), limits = c(-5, 13)) +   
                         labs(title = "") +
   scale_fill_gradient2(name = "Similitud", 
                       low = "#ffffffff", 
                       mid = "#a50f15", 
                       high = "#67000d", 
                       midpoint = 0.5,           
                       limits = c(0, 1),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10), 
    legend.position = "none",
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

mapa3<-ggplot() +
  
  geom_tile(data = area_similares_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30), limits = c(-77, -34)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30), limits = c(-35, 6)) +   
                         labs(title = "") +
   scale_fill_gradient2(name = "Similitud", 
                       low = "#ffffffff", 
                       mid = "#a50f15", 
                       high = "#67000d", 
                       midpoint = 0.5,           
                       limits = c(0, 1),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10), 
    legend.position = "none",
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

mapa4<-ggplot() +
  
  geom_tile(data = area_similares_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30), limits = c(12, 32)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30), limits = c(-14, 6)) +   
                         labs(title = "") +
   scale_fill_gradient2(name = "Similitud", 
                       low = "#ffffffff", 
                       mid = "#a50f15", 
                       high = "#67000d", 
                       midpoint = 0.5,           
                       limits = c(0, 1),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),   
    legend.position = "none",
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )

mapa5<-ggplot() +
  
  geom_tile(data = area_similares_df, aes(x = x, y = y, fill = value)) +
  geom_sf(data = paises, fill = NA, color = "gray30") +  
  coord_sf(expand = FALSE) +                                        
  scale_x_continuous(name = "Longitud", breaks = seq(-180, 180, 30), limits = c(128, 154)) +  
  scale_y_continuous(name = "Latitud", breaks = seq(-90, 90, 30), limits = c(-12, 1)) +   
                         labs(title = "") +
   scale_fill_gradient2(name = "Similitud", 
                       low = "#ffffffff", 
                       mid = "#a50f15", 
                       high = "#67000d", 
                       midpoint = 0.5,           
                       limits = c(0, 1),     
                       oob = scales::squish) + 
  theme_minimal() +                                                  
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), 
    axis.title = element_text(face = "bold", size = 12),              
    axis.text = element_text(size = 10),   
    legend.position = "none",
    panel.grid.major = element_line(color = "gray80", linetype = "dotted") 
  )


mundo<-plot_grid(mapa1, ncol=1)
mapaises<-plot_grid( mapa2, mapa3, mapa4, ncol = 3)
plot_grid( mundo, mapaises,            rel_heights = c(1.5, 1),ncol = 1)

7 Conclusiones

Los análisis de la aptitud climática para el cultivo de la caña de azúcar a nivel global mostraron que las áreas mas aptas para dicho cultivo se restringen a la porción tropical y subtropical del planeta, exceptuando los desiertos y las altas montañas. Las mayores extensiones de estas áreas aptas para el cultivo es la cuenca del río Amazonas y la cuenca del río Congo, las segundas mayores extensiones se encuentran cerca del punto de origen de la especie de la caña de azúcar alrededor de la isla de Papúa Nueva Guinea.

Los países seleccionados para el análisis individual se basaron en la extensión de las áreas aptas para este cultivo, sin embargo, de estos países Brasil es el país con mayor producción de caña de azúcar en el mundo (FAO. 2022) y Colombia es el país con una producción media a baja de esta planta. En contraste, la República Democrática del Congo es una país con una producción de caña muy baja y no figura entre los principales productores del mundo. En estos países las zonas aptas representan más del 50% de la extensión del país.

Para el análisis de las series de tiempo en tres puntos del Valle del Cauca, se seleccionaron ubicaciones en el norte centro y su del valle geográfico del río Cauca, donde estos puntos representaron un comportamiento de estas dos variables bastante similar con una tendencia a aumentar la temperatura entre los meses de julio y agosto y una tendencia bimodal en las precipitaciones con picos en abril y octubre. Los vaolres promedios de estas variables fueron utilizados para evaluar la similitud de zonas aptas en otras partes del planeta y se encontró que al combinar estas dos variables las áreas con similitud disminuyen en extensión. Curiosamente en el valle geográfico del río Cauca no se encontró un amplia extensión de estas áreas y solo algunos otros puntos coinciden con las media de temperatura y precipitación de los puntos seleccionados.

Literatura Citada

Cerasoli, Francesco, Paola D’Alessandro, and Maurizio Biondi. 2022. “Worldclim 2.1 Versus Worldclim 1.4: Climatic Niche and Grid Resolution Affect Between-Version Mismatches in Habitat Suitability Models Predictions Across Europe.” Ecology and Evolution 12 (2): e8430.
FAO. 2022. World Food and Agriculture Statistical Yearbook 2022. FAO.
Galloway, John Herbert. 2005. The Sugar Cane Industry: An Historical Geography from Its Origins to 1914. Vol. 12. Cambridge University Press.