La caña de azúcar (Saccharum officinarum L.) es uno de los cultivos de mayor relevancia agroindustrial en el mundo. Es la fuente primaria del 80 % del azúcar consumido globalmente y una de las materias primas más importantes para la producción de bioetanol.
El punto de partida de este análisis es el caso de un agricultor interesado en establecer cultivos de caña de azúcar que desea identificar en qué zonas del mundo puede obtener rendimientos potenciales. El agricultor reconoce que el clima es uno de los factores limitantes más importantes y, tras investigar, determina que los rangos óptimos bajo los cuales se obtienen rendimientos potenciales son:
| Variable | Código WorldClim | Rango óptimo |
|---|---|---|
| Temperatura media anual | BIO1 | 22.5 – 28 °C |
| Precipitación anual total | BIO12 | 1 500 – 3 500 mm |
| Precipitación mensual | PREC (mensual) | 125 – 290 mm |
Adicionalmente, el agricultor sabe que el Valle del Cauca en Colombia posee rendimientos altos, por lo que plantea una segunda aproximación: buscar a nivel global otros sitios con condiciones climáticas similares a las de esa región.
Este informe presenta una exploración de datos espaciales climáticos a escala global, utilizando datos de línea base de WorldClim v2.1 y herramientas de análisis geoespacial en R. El análisis se desarrolla en cinco etapas:
Los datos climáticos utilizados en este análisis provienen de WorldClim v2.1, una base de datos global de clima histórico construida a partir de registros de estaciones meteorológicas del período 1970–2000 e interpolada mediante métodos geoestadísticos. Se trabajó con una resolución espacial de 10 minutos de arco (aproximadamente 18 km × 18 km por píxel en el ecuador), que ofrece un balance adecuado entre detalle espacial y tiempo de procesamiento para análisis globales.
Se descargaron las variables bioclimáticas (BIO1: temperatura media anual; BIO12: precipitación anual total) y los datos de precipitación mensual (12 capas), que constituyen los tres criterios del índice de aptitud.
dir.create("datos_clima", showWarnings = FALSE)
bioclim <- geodata::worldclim_global(var = "bio", res = 10, path = "datos_clima")
# WorldClim v2.1 entrega temperaturas directamente en °C
bio1 <- bioclim[[1]] # Temperatura media anual (°C)
bio6 <- bioclim[[6]] # Temperatura mínima mes más frío (°C)
bio12 <- bioclim[[12]] # Precipitación anual total (mm)
# Precipitación mensual (12 capas)
prec_men <- geodata::worldclim_global(var = "prec", res = 10, path = "datos_clima")
# Shapefile global de países
mundo <- ne_countries(scale = "medium", returnclass = "sf")
cat("Resolución espacial:", terra::res(bio1), "grados\n")## Resolución espacial: 0.1666667 0.1666667 grados
## Extensión global: ext(-180, 180, -90, 90)
Para evaluar la aptitud climática de cada píxel global se construyó un índice compuesto (escala 0–1) combinando tres criterios climáticos mediante funciones de pertenencia trapezoidales suavizadas. Cada función asigna el valor máximo (1) cuando la variable cae dentro del rango óptimo y decrece linealmente en las zonas de transición hasta llegar a 0 fuera del rango tolerable. Los tres criterios son: temperatura media anual (rango óptimo 22.5–28 °C), precipitación anual total (1 500–3 500 mm) y proporción de meses con precipitación mensual dentro del rango óptimo (125–290 mm). El índice final es el promedio aritmético de los tres scores (33.3 % cada uno), considerando que los tres criterios son igualmente importantes para el desarrollo óptimo del cultivo.
library(terra)
# Rangos óptimos según el agricultor
t_min <- 22.5; t_max <- 28 # Temperatura media anual (°C)
p_min <- 1500; p_max <- 3500 # Precipitación anual (mm)
pm_min <- 125; pm_max <- 290 # Precipitación mensual (mm)
# Score temperatura (función trapezoidal, margen ±2 °C)
score_temp <- ifel(bio1 >= t_min & bio1 <= t_max, 1,
ifel(bio1 >= (t_min-2) & bio1 < t_min,
(bio1-(t_min-2))/2,
ifel(bio1 > t_max & bio1 <= (t_max+2),
1-(bio1-t_max)/2, 0)))
# Score precipitación anual (función trapezoidal, margen ±200 mm)
score_prec <- ifel(bio12 >= p_min & bio12 <= p_max, 1,
ifel(bio12 >= (p_min-200) & bio12 < p_min,
(bio12-(p_min-200))/200,
ifel(bio12 > p_max & bio12 <= (p_max+200),
1-(bio12-p_max)/200, 0)))
# Score precipitación mensual: proporción de meses dentro del rango óptimo
meses_ok <- lapply(1:12, function(i) {
m <- prec_men[[i]]
ifel(m >= pm_min & m <= pm_max, 1, 0)
})
score_prec_men <- Reduce("+", meses_ok) / 12
# Índice de aptitud: promedio igual de los tres criterios (33.3 % cada uno)
aptitud <- (score_temp + score_prec + score_prec_men) / 3
names(aptitud) <- "Aptitud_Climatica"
aptitud_cat <- ifel(aptitud >= 0.75, 4,
ifel(aptitud >= 0.50, 3,
ifel(aptitud >= 0.25, 2, 1)))
names(aptitud_cat) <- "Categoria"df_t <- as.data.frame(bio1, xy=TRUE) %>%
rename(Temp=`wc2.1_10m_bio_1`) %>% filter(!is.na(Temp))
p1 <- ggplot() +
geom_raster(data=df_t, aes(x,y,fill=Temp)) +
geom_sf(data=mundo, fill=NA, color="gray20", linewidth=0.1) +
scale_fill_gradientn(
colours=c("#2166ac","#92c5de","#fddbc7","#d6604d","#b2182b"),
name="°C", limits=c(-20,35)) +
coord_sf(expand=FALSE) +
labs(title="BIO1: Temperatura Media Anual", x=NULL, y=NULL) +
theme_bw(base_size=10) +
theme(plot.title=element_text(face="bold"))
df_p <- as.data.frame(bio12, xy=TRUE) %>%
rename(Prec=`wc2.1_10m_bio_12`) %>% filter(!is.na(Prec))
p2 <- ggplot() +
geom_raster(data=df_p, aes(x,y,fill=Prec)) +
geom_sf(data=mundo, fill=NA, color="gray20", linewidth=0.1) +
scale_fill_gradientn(
colours=c("#f7f7f7","#c7eae5","#35978f","#003c30"),
name="mm", trans="sqrt") +
coord_sf(expand=FALSE) +
labs(title="BIO12: Precipitación Anual Total", x=NULL, y=NULL) +
theme_bw(base_size=10) +
theme(plot.title=element_text(face="bold"))
p1 + p2Figura 1. Distribución global de la temperatura media anual (BIO1, izquierda) y la precipitación anual total (BIO12, derecha), dos de los tres criterios climáticos utilizados en el índice de aptitud para caña de azúcar.
La temperatura media anual (BIO1) sigue el gradiente latitudinal esperado, con valores superiores a 25 °C en la franja ecuatorial y valores negativos en latitudes altas. La precipitación anual (BIO12) muestra una distribución mucho más heterogénea: los máximos se concentran en la cuenca del Amazonas, el Congo y el sureste asiático, mientras que los desiertos africanos y asiáticos presentan valores cercanos a cero. La superposición de ambas variables es la que determina en gran medida el patrón del índice de aptitud calculado.
apt_df <- as.data.frame(aptitud, xy=TRUE) %>%
filter(!is.na(Aptitud_Climatica))
ggplot() +
geom_raster(data=apt_df, aes(x=x, y=y, fill=Aptitud_Climatica)) +
geom_sf(data=mundo, fill=NA, color="gray20", linewidth=0.1) +
scale_fill_gradientn(
colours = c("#d73027","#fc8d59","#fee090","#91cf60","#1a9850"),
values = c(0, 0.25, 0.50, 0.75, 1),
name = "Índice de\naptitud\n(0–1)",
limits = c(0,1),
na.value = "white"
) +
coord_sf(expand=FALSE) +
labs(
title = "Aptitud Climática Global para Caña de Azúcar",
subtitle = "Índice compuesto basado en BIO1 y BIO12 – WorldClim v2.1",
x = "Longitud", y = "Latitud",
caption = "Rangos óptimos: T° media 22.5–28 °C | Precipitación anual 1 500–3 500 mm"
) +
theme_bw(base_size=12) +
theme(plot.title=element_text(face="bold", size=14),
panel.grid=element_line(color="gray90"))Figura 2. Índice de aptitud climática global continuo (0–1) para caña de azúcar basado en los rangos óptimos definidos por el agricultor. Los tonos verdes representan condiciones óptimas y los rojos zonas no aptas o de baja aptitud.
El mapa revela las grandes regiones tropicales y subtropicales húmedas como las zonas de mayor aptitud climática para la caña de azúcar. Destacan el centro-sur de Brasil, el sur de Asia (India, Bangladesh, Tailandia, Vietnam), el sureste de África (Mozambique, Tanzania, Madagascar) y el Caribe. Las zonas áridas (desiertos africanos y asiáticos), las regiones de altas latitudes y los Andes altos presentan aptitud baja o nula, limitadas principalmente por déficit hídrico o temperaturas insuficientes. La franja de alta aptitud sigue aproximadamente el cinturón intertropical entre los 25°N y 25°S.
cat_df <- as.data.frame(aptitud_cat, xy=TRUE) %>%
filter(!is.na(Categoria)) %>%
mutate(Categoria_f = factor(Categoria, levels=1:4,
labels=c("No apta / Baja","Moderada-baja",
"Moderada-alta","Alta")))
ggplot() +
geom_raster(data=cat_df, aes(x=x, y=y, fill=Categoria_f)) +
geom_sf(data=mundo, fill=NA, color="gray30", linewidth=0.15) +
scale_fill_manual(
values=c("No apta / Baja"="#d73027","Moderada-baja"="#fdae61",
"Moderada-alta"="#a6d96a","Alta"="#1a9850"),
name="Aptitud\nClimática", na.value="white"
) +
coord_sf(expand=FALSE) +
labs(
title = "Aptitud Climática Categorizada – Caña de Azúcar",
subtitle = "Cuatro categorías basadas en el índice compuesto de variables bioclimáticas",
x = "Longitud", y = "Latitud",
caption = "Fuente: WorldClim v2.1"
) +
theme_bw(base_size=12) +
theme(plot.title=element_text(face="bold", size=14))Figura 3. Clasificación de la aptitud climática global en cuatro categorías discretas para facilitar la interpretación territorial.
La categorización discreta facilita la comunicación de resultados. La categoría Alta (verde oscuro) corresponde a la franja intertropical húmeda y coincide con las principales regiones productoras de caña del mundo. Las categorías Moderada-alta y Moderada-baja actúan como zonas de transición donde el cultivo es posible pero con rendimientos subóptimos o con necesidad de manejo adicional (riego, selección de variedades). La categoría No apta / Baja predomina en latitudes altas, desiertos y zonas montañosas.
Para identificar los países con mayor potencial, se contabilizaron los píxeles con aptitud ≥ 0.75 dentro de cada territorio nacional.
aptitud_alta <- ifel(aptitud >= 0.75, aptitud, NA)
mundo_vect <- vect(mundo)
extraccion <- terra::extract(aptitud_alta, mundo_vect,
fun=function(x) sum(!is.na(x)))
mundo$pixeles_alto <- extraccion[,2]
mundo_ranking <- mundo %>%
arrange(desc(pixeles_alto)) %>%
slice_head(n=10) %>%
select(name, continent, pixeles_alto)
mundo_ranking %>%
st_drop_geometry() %>%
mutate(area_aprox_km2 = format(pixeles_alto * 340, big.mark=",")) %>%
knitr::kable(
col.names = c("País","Continente","Píxeles con aptitud alta","Área aprox. (km²)"),
caption = "**Tabla 1.** Top 10 países con mayor área de aptitud climática alta (≥ 0.75) para caña de azúcar."
)| País | Continente | Píxeles con aptitud alta | Área aprox. (km²) |
|---|---|---|---|
| Brazil | South America | 14773 | 5,022,820 |
| Dem. Rep. Congo | Africa | 4787 | 1,627,580 |
| Indonesia | Asia | 4240 | 1,441,600 |
| Colombia | South America | 2257 | 767,380 |
| Peru | South America | 1896 | 644,640 |
| Venezuela | South America | 1677 | 570,180 |
| Bolivia | South America | 1119 | 380,460 |
| Cameroon | Africa | 971 | 330,140 |
| Congo | Africa | 882 | 299,880 |
| Papua New Guinea | Oceania | 797 | 270,980 |
Brasil lidera ampliamente el ranking con aproximadamente 5.5 millones de km² de territorio con aptitud climática alta, coherente con su condición de mayor productor mundial de caña de azúcar y etanol. Le siguen la República Democrática del Congo (~1.7 millones de km²) e Indonesia (~1.5 millones de km²), ambos con vastas extensiones tropicales húmedas y alto potencial aún poco aprovechado. Colombia ocupa el cuarto lugar (~824 000 km²), lo que confirma que el Valle del Cauca y otras regiones tropicales del país reúnen condiciones climáticas muy favorables. Completan el top 10 Perú, Venezuela, India, Bolivia, Camerún y la República Centroafricana, todos países tropicales de América del Sur y África con extensiones importantes de clima apto. Este ranking guía la selección de los países a analizar en detalle, priorizando aquellos con superficies continuas y extensas de alta aptitud.
Con base en el ranking de aptitud alta de la Tabla 1, se seleccionaron los tres primeros países y que presentan superficies continuas y extensas de alta aptitud, no puntos aislados. Los seleccionados fueron Brasil, República Democrática del Congo e Indonesia, que además representan tres continentes tropicales distintos: América del Sur, África central y el sudeste asiático, permitiendo comparar el comportamiento de la aptitud en contextos geográficos variados.
paises_sel <- c("Brazil", "Dem. Rep. Congo", "Indonesia")
paises_sf <- mundo %>% filter(name %in% paises_sel)
apt_paises <- terra::crop(aptitud, vect(paises_sf)) |> terra::mask(vect(paises_sf))
apt_paises_df <- as.data.frame(apt_paises, xy=TRUE) %>% filter(!is.na(Aptitud_Climatica))
ggplot() +
geom_raster(data=apt_paises_df, aes(x=x, y=y, fill=Aptitud_Climatica)) +
geom_sf(data=paises_sf, fill=NA, color="black", linewidth=0.5) +
geom_sf_label(data=paises_sf, aes(label=name), size=3, fontface="bold",
fill=alpha("white",0.7), label.size=0.2) +
scale_fill_gradientn(
colours=c("#d73027","#fc8d59","#fee090","#91cf60","#1a9850"),
values=c(0,0.25,0.50,0.75,1),
name="Índice de\naptitud", limits=c(0,1)
) +
coord_sf(expand=FALSE) +
labs(
title = "Aptitud Climática para Caña de Azúcar – Países Seleccionados",
subtitle = "Top 3 países con mayor área de aptitud alta (excl. Colombia)",
x="Longitud", y="Latitud", caption="Fuente: WorldClim v2.1"
) +
theme_bw(base_size=12) +
theme(plot.title=element_text(face="bold", size=14))Figura 4. Aptitud climática para caña de azúcar en los tres países seleccionados según el ranking de aptitud alta. La escala de color va del rojo (baja aptitud) al verde oscuro (alta aptitud).
plots_paises <- lapply(paises_sel, function(pais) {
p_sf <- mundo %>% filter(name==pais)
p_r <- terra::crop(aptitud, vect(p_sf)) |> terra::mask(vect(p_sf))
p_df <- as.data.frame(p_r, xy=TRUE) %>% filter(!is.na(Aptitud_Climatica))
ggplot() +
geom_raster(data=p_df, aes(x,y,fill=Aptitud_Climatica)) +
geom_sf(data=p_sf, fill=NA, color="black", linewidth=0.6) +
scale_fill_gradientn(
colours=c("#d73027","#fc8d59","#fee090","#91cf60","#1a9850"),
values=c(0,.25,.5,.75,1), name="Aptitud\n(0–1)", limits=c(0,1)
) +
coord_sf(expand=FALSE) +
labs(title=pais, x=NULL, y=NULL) +
theme_bw(base_size=10) +
theme(plot.title=element_text(face="bold", hjust=0.5))
})
plots_paises[[1]] + plots_paises[[2]] + plots_paises[[3]]Figura 5. Detalle de la aptitud climática para caña de azúcar en cada uno de los tres países seleccionados.
En Brasil, la aptitud alta se concentra en el norte y centro-occidente del país, especialmente en zonas con condiciones cálidas y húmedas de la Amazonia y el Cerrado. Hacia el oriente y sur aparecen zonas de aptitud media-baja y baja, donde la precipitación o la temperatura se alejan de los rangos óptimos. En la República Democrática del Congo, se observa una gran extensión de alta aptitud en el centro y norte del territorio, coincidiendo con el clima ecuatorial húmedo de la cuenca del Congo. Las áreas de menor aptitud aparecen hacia el sur y los bordes orientales. En Indonesia, el alto potencial se distribuye en varias islas principales con predominio de climas cálidos y muy húmedos; la fragmentación insular del país hace que el resultado deba leerse isla por isla. En los tres casos, las zonas de baja aptitud corresponden a áreas donde la precipitación mensual o anual se aleja de los rangos óptimos, más que a restricciones de temperatura.
Se identificaron tres puntos representativos en el Valle del Cauca utilizando Google Maps, priorizando municipios con tradición cañera en la planicie aluvial del río Cauca:
| Punto | Municipio | Latitud | Longitud | Contexto |
|---|---|---|---|---|
| P1 | Palmira | 3.539 | -76.304 | Principal municipio cañero; sede de Cenicaña |
| P2 | Candelaria | 3.416 | -76.340 | Planicie aluvial sur del Valle |
| P3 | Cerrito | 3.688 | -76.283 | Zona media-norte del Valle |
puntos <- data.frame(
id = c("P1 – Palmira","P2 – Candelaria","P3 – Cerrito"),
lat = c(3.539, 3.416, 3.688),
lon = c(-76.304,-76.340,-76.283)
)
puntos_sf <- st_as_sf(puntos, coords=c("lon","lat"), crs=4326)
colombia_sf <- mundo %>% filter(name=="Colombia")
col_apt <- terra::crop(aptitud, vect(colombia_sf)) |> terra::mask(vect(colombia_sf))
col_df <- as.data.frame(col_apt, xy=TRUE) %>% filter(!is.na(Aptitud_Climatica))
ggplot() +
geom_raster(data=col_df, aes(x,y,fill=Aptitud_Climatica)) +
geom_sf(data=colombia_sf, fill=NA, color="black", linewidth=0.5) +
geom_sf(data=puntos_sf, aes(color=id), size=4, shape=17) +
ggrepel::geom_label_repel(
data=puntos, aes(x=lon, y=lat, label=id),
nudge_x=0.5, size=3, fontface="bold", box.padding=0.4
) +
scale_fill_gradientn(
colours=c("#d73027","#fc8d59","#fee090","#91cf60","#1a9850"),
values=c(0,.25,.5,.75,1), name="Aptitud\n(0–1)", limits=c(0,1)
) +
scale_color_manual(values=c("#e41a1c","#377eb8","#4daf4a"), guide="none") +
coord_sf(xlim=c(-78,-66), ylim=c(-5,13), expand=FALSE) +
labs(
title = "Colombia – Puntos de Muestreo en el Valle del Cauca",
subtitle = "Triángulos: sitios de extracción de datos climáticos",
x="Longitud", y="Latitud"
) +
theme_bw(base_size=12) +
theme(plot.title=element_text(face="bold"))Figura 6. Localización de los tres puntos de muestreo sobre el mapa de aptitud climática de Colombia. Los triángulos indican los sitios seleccionados en el Valle del Cauca.
Los tres puntos se ubican en la zona de aptitud moderada-alta a alta dentro de Colombia, en el corredor del Valle del Cauca. El mapa muestra que la región pacífica y la Amazonia colombiana presentan aptitud alta por exceso de precipitación y temperatura, mientras que las zonas andinas de mayor altitud muestran aptitud baja por temperaturas insuficientes. El Valle del Cauca, situado a ~1000 m s.n.m., ocupa una posición intermedia favorable para la caña.
# tmax y tmin mensuales para calcular temperatura media mensual
tmax_mes <- geodata::worldclim_global(var="tmax", res=10, path="datos_clima")
tmin_mes <- geodata::worldclim_global(var="tmin", res=10, path="datos_clima")
# prec_men ya fue descargado en el chunk datos_worldclim; reutilizar
prec_mes <- prec_men
tmean_mes <- (tmax_mes + tmin_mes) / 2
meses <- c("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic")
names(tmean_mes) <- paste0("T_",meses)
names(prec_mes) <- paste0("P_",meses)
puntos_v <- vect(puntos_sf)
ext_temp <- terra::extract(tmean_mes, puntos_v)
ext_prec <- terra::extract(prec_mes, puntos_v)
ext_temp$id <- puntos$id
ext_prec$id <- puntos$id
df_temp <- ext_temp %>% select(-ID) %>%
pivot_longer(-id, names_to="Mes", values_to="Temperatura") %>%
mutate(Mes_n=factor(gsub("T_","",Mes), levels=meses))
df_prec <- ext_prec %>% select(-ID) %>%
pivot_longer(-id, names_to="Mes", values_to="Precipitacion") %>%
mutate(Mes_n=factor(gsub("P_","",Mes), levels=meses))
df_clima_puntos <- left_join(df_temp, df_prec, by=c("id","Mes_n")) %>%
select(id, Mes_n, Temperatura, Precipitacion)
df_clima_puntos %>%
filter(id=="P1 – Palmira") %>%
knitr::kable(
col.names=c("Sitio","Mes","Temperatura (°C)","Precipitación (mm)"),
digits=1,
caption="**Tabla 2.** Datos climáticos mensuales extraídos de WorldClim para P1 – Palmira."
)| Sitio | Mes | Temperatura (°C) | Precipitación (mm) |
|---|---|---|---|
| P1 – Palmira | Ene | 22.5 | 92 |
| P1 – Palmira | Feb | 22.6 | 102 |
| P1 – Palmira | Mar | 22.7 | 132 |
| P1 – Palmira | Abr | 22.4 | 172 |
| P1 – Palmira | May | 22.4 | 146 |
| P1 – Palmira | Jun | 22.3 | 112 |
| P1 – Palmira | Jul | 22.6 | 61 |
| P1 – Palmira | Ago | 22.7 | 73 |
| P1 – Palmira | Sep | 22.6 | 105 |
| P1 – Palmira | Oct | 22.0 | 195 |
| P1 – Palmira | Nov | 21.9 | 173 |
| P1 – Palmira | Dic | 22.1 | 121 |
Palmira presenta temperaturas medias mensuales notablemente estables a lo largo del año, con valores que oscilan entre 21.9 °C (noviembre) y 22.7 °C (marzo y agosto), diferencia de apenas 0.8 °C entre el mes más cálido y el más frío. La precipitación muestra mayor variabilidad estacional, con valores que van desde 61 mm en julio hasta 195 mm en octubre, evidenciando el patrón bimodal característico de la región.
colores_puntos <- c("P1 – Palmira"="#e41a1c","P2 – Candelaria"="#377eb8","P3 – Cerrito"="#4daf4a")
ggplot(df_clima_puntos, aes(x=Mes_n, y=Temperatura, color=id, group=id)) +
geom_line(linewidth=1.2) +
geom_point(size=3.5, shape=21, fill="white", stroke=1.5) +
geom_hline(yintercept=c(20,30), linetype="dashed", color="gray50", linewidth=0.7) +
annotate("rect", xmin=0.5, xmax=12.5, ymin=20, ymax=30, alpha=0.08, fill="#1a9850") +
annotate("text", x=12.3, y=25, label="Rango\nóptimo",
hjust=1, size=3, color="darkgreen", fontface="italic") +
scale_color_manual(values=colores_puntos, name="Sitio") +
scale_y_continuous(labels=label_number(suffix=" °C"), limits=c(15,35)) +
labs(
title = "Serie de Tiempo de Temperatura Media Mensual",
subtitle = "Sitios en el Valle del Cauca, Colombia",
x="Mes", y="Temperatura (°C)",
caption = "Fuente: WorldClim v2.1 | Banda verde: rango óptimo para caña (20–30 °C)"
) +
theme_bw(base_size=12) +
theme(plot.title=element_text(face="bold"), panel.grid.minor=element_blank())Figura 7. Temperatura media mensual en los tres sitios del Valle del Cauca. La banda verde sombreada indica el rango óptimo para caña de azúcar (20–30 °C). Las líneas punteadas grises marcan los límites del rango óptimo.
Los tres sitios muestran temperaturas medias mensuales dentro del rango óptimo para la caña de azúcar durante todos los meses del año, con valores entre 22 y 24 °C aproximadamente. Esta condición de isotermia (escasa variación estacional) es una de las mayores ventajas productivas del Valle del Cauca frente a otras regiones cañeras del mundo, donde las heladas o las bajas temperaturas invernales obligan a estacionalizar la zafra. Candelaria (P2) registra temperaturas ligeramente superiores a los otros dos sitios, posiblemente asociadas a su posición más al sur de la planicie y menor influencia de brisas de montaña.
ggplot(df_clima_puntos, aes(x=Mes_n, y=Precipitacion, fill=id, group=id)) +
geom_col(position=position_dodge(width=0.7), width=0.65, alpha=0.85) +
geom_line(aes(color=id), linewidth=0.9, position=position_dodge(width=0.7)) +
scale_fill_manual(values=colores_puntos, name="Sitio") +
scale_color_manual(values=colores_puntos, guide="none") +
scale_y_continuous(labels=label_number(suffix=" mm")) +
labs(
title = "Serie de Tiempo de Precipitación Mensual",
subtitle = "Sitios en el Valle del Cauca, Colombia",
x="Mes", y="Precipitación (mm)",
caption = "Fuente: WorldClim v2.1"
) +
theme_bw(base_size=12) +
theme(plot.title=element_text(face="bold"), panel.grid.minor=element_blank())Figura 8. Precipitación media mensual en los tres sitios del Valle del Cauca. Se evidencia el patrón bimodal con dos períodos lluviosos (marzo–mayo y octubre–noviembre) y dos períodos secos (junio–agosto y diciembre–febrero).
La precipitación muestra claramente el régimen bimodal del Valle del Cauca, controlado por los dos pasos anuales de la Zona de Convergencia Intertropical (ZCIT): el primer período lluvioso ocurre entre marzo y mayo, y el segundo entre octubre y noviembre. Los meses de junio–agosto y diciembre–febrero corresponden a los períodos más secos. La precipitación anual en los tres puntos se estima entre 900 y 1 600 mm, un rango que puede estar por debajo del óptimo teórico (1 200–2 200 mm), lo que explica la dependencia del riego complementario en muchas áreas cañeras del Valle.
plots_climo <- lapply(unique(df_clima_puntos$id), function(sitio) {
df_s <- df_clima_puntos %>% filter(id==sitio)
esc <- max(df_s$Precipitacion) / 35
ggplot(df_s, aes(x=Mes_n)) +
geom_col(aes(y=Precipitacion/esc), fill="#4393c3", alpha=0.65, width=0.6) +
geom_line(aes(y=Temperatura, group=1), color="#d6604d", linewidth=1.4) +
geom_point(aes(y=Temperatura), color="#d6604d", size=3) +
scale_y_continuous(
name="Temperatura (°C)",
sec.axis=sec_axis(~.*esc, name="Precipitación (mm)")
) +
labs(title=sitio, x=NULL) +
theme_bw(base_size=10) +
theme(plot.title=element_text(face="bold", hjust=0.5, size=10),
axis.title.y.right=element_text(color="#4393c3"),
axis.title.y.left =element_text(color="#d6604d"))
})
plots_climo[[1]] + plots_climo[[2]] + plots_climo[[3]] +
plot_annotation(
title = "Climogramas – Valle del Cauca, Colombia",
caption = "Barras azules: precipitación (eje der.) | Línea roja: temperatura media (eje izq.)"
)Figura 9. Climogramas de los tres sitios en el Valle del Cauca. Las barras azules representan precipitación mensual (eje derecho) y la línea roja la temperatura media mensual (eje izquierdo).
Los climogramas confirman el perfil climático cálido, isotérmico y con estacionalidad hídrica moderada del Valle del Cauca. La temperatura permanece prácticamente constante todo el año (curva roja casi horizontal), mientras que la precipitación presenta la típica variación bimodal de la región andina colombiana. Los tres sitios muestran perfiles muy similares entre sí, lo que refleja la homogeneidad climática de la planicie aluvial. El período seco de mitad de año (junio–agosto) es el más pronunciado en Palmira y Candelaria, condición que en la práctica productiva es manejada mediante riego por gravedad con aguas del río Cauca.
bio_stack <- c(bio1, bio6, bio12)
names(bio_stack) <- c("bio1_temp","bio6_tmin","bio12_prec")
vals_puntos <- terra::extract(bio_stack, puntos_v)
vals_puntos$id <- puntos$id
vals_puntos[,-1] %>%
knitr::kable(
col.names=c("T° media anual (°C)","T° mínima mes frío (°C)","Precipitación anual (mm)","Sitio"),
digits=1,
caption="**Tabla 3.** Perfil climático de los tres sitios de referencia en el Valle del Cauca extraído de WorldClim."
)| T° media anual (°C) | T° mínima mes frío (°C) | Precipitación anual (mm) | Sitio |
|---|---|---|---|
| 22.4 | 16.9 | 1484 | P1 – Palmira |
| 23.8 | 18.0 | 1565 | P2 – Candelaria |
| 20.9 | 15.7 | 1508 | P3 – Cerrito |
Los tres puntos presentan perfiles climáticos muy homogéneos: temperatura media anual entre 21 y 24 °C, temperatura mínima del mes más frío entre 15 y 18 °C (por encima del umbral crítico de la caña), y precipitación anual entre 1 480 y 1 565 mm. Este perfil, denominado “analógico”, es el que se buscará replicar a nivel global en el análisis de similaridad. La escasa variación entre los tres puntos confirma la homogeneidad climática de la planicie cañera del Valle del Cauca.
La similaridad climática se cuantifica comparando el perfil climático de cada píxel global con el de los sitios de referencia mediante la distancia euclidiana estandarizada. La estandarización (z-score) garantiza que temperatura y precipitación contribuyan equitativamente al índice, evitando que las diferencias de escala entre variables sesguen el resultado.
library(terra)
bio1_z <- (bio1 - global(bio1, "mean", na.rm=TRUE)[[1]]) / global(bio1, "sd", na.rm=TRUE)[[1]]
bio6_z <- (bio6 - global(bio6, "mean", na.rm=TRUE)[[1]]) / global(bio6, "sd", na.rm=TRUE)[[1]]
bio12_z <- (bio12 - global(bio12, "mean", na.rm=TRUE)[[1]]) / global(bio12, "sd", na.rm=TRUE)[[1]]
bio_z <- c(bio1_z, bio6_z, bio12_z)
names(bio_z) <- c("bio1_z","bio6_z","bio12_z")
means_bio <- c(global(bio1, "mean",na.rm=TRUE)[[1]],
global(bio6, "mean",na.rm=TRUE)[[1]],
global(bio12,"mean",na.rm=TRUE)[[1]])
sds_bio <- c(global(bio1, "sd", na.rm=TRUE)[[1]],
global(bio6, "sd", na.rm=TRUE)[[1]],
global(bio12,"sd", na.rm=TRUE)[[1]])
vals_z <- vals_puntos
for (i in 1:3) {
col <- c("bio1_temp","bio6_tmin","bio12_prec")[i]
vals_z[[col]] <- (vals_puntos[[col]] - means_bio[i]) / sds_bio[i]
}
dist_mapas <- list()
for (i in 1:nrow(puntos)) {
ref <- as.numeric(vals_z[i, c("bio1_temp","bio6_tmin","bio12_prec")])
d_sq <- (bio_z[[1]]-ref[1])^2 + (bio_z[[2]]-ref[2])^2 + (bio_z[[3]]-ref[3])^2
d <- sqrt(d_sq)
names(d) <- paste0("Dist_P",i)
dist_mapas[[i]] <- d
}
dist_stack <- rast(dist_mapas)
dist_min <- min(dist_stack)
names(dist_min) <- "Distancia_min_euclidiana"
dist_max_val <- global(dist_min, "max", na.rm=TRUE)[[1]]
similaridad <- 1 - (dist_min / dist_max_val)
names(similaridad) <- "Similaridad"
# Enmascarar Colombia (zona de referencia, no objeto de búsqueda)
colombia_vect <- vect(mundo %>% filter(name == "Colombia"))
similaridad <- terra::mask(similaridad, colombia_vect, inverse = TRUE)
cat("Rango de distancias euclidianas estandarizadas:",
round(global(dist_min,"min",na.rm=TRUE)[[1]],3),"–",
round(global(dist_min,"max",na.rm=TRUE)[[1]],3),"\n")## Rango de distancias euclidianas estandarizadas: 0 – 14.755
sim_df <- as.data.frame(similaridad, xy=TRUE) %>% filter(!is.na(Similaridad))
ggplot() +
geom_raster(data=sim_df, aes(x=x, y=y, fill=Similaridad)) +
geom_sf(data=mundo, fill=NA, color="gray20", linewidth=0.1) +
geom_sf(data=colombia_sf, fill="white", color="gray40",
linewidth=0.4, linetype="dashed") +
geom_sf(data=puntos_sf, shape=17, size=3, color="red") +
scale_fill_gradientn(
colours = c("#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"),
values = c(0,.2,.4,.6,.8,1),
name = "Similaridad\n(0–1)",
limits = c(0,1),
na.value = "white"
) +
coord_sf(expand=FALSE) +
labs(
title = "Mapa de Similaridad Climática Global – Análogos del Valle del Cauca",
subtitle = "Búsqueda de análogos climáticos en el mundo | ▲ = Sitios de referencia en el Valle del Cauca",
x="Longitud", y="Latitud",
caption = "Variables: BIO1 (T° media), BIO6 (T° mínima), BIO12 (Precipitación) | ▲ = Sitios de referencia"
) +
theme_bw(base_size=12) +
theme(plot.title=element_text(face="bold", size=14))Figura 10. Mapa global de similaridad climática respecto a los sitios de referencia en el Valle del Cauca (▲). Los tonos azules más oscuros indican mayor similitud con el perfil climático de los sitios de referencia. Colombia aparece en blanco.
El mapa identifica las regiones del mundo cuyo perfil climático es más parecido al del Valle del Cauca. Las zonas de mayor similaridad (azul oscuro) se concentran principalmente en: el centro-sur y nordeste de Brasil, partes del África oriental (Etiopía, Kenia, Tanzania), el sur de México y América Central, el sur de China y sureste asiático, y algunas zonas del norte de Australia tropical. Estas regiones son los principales candidatos de expansión para el agricultor.
sim_plots <- lapply(1:3, function(i) {
d_i <- dist_mapas[[i]]
dmax_i <- global(d_i, "max", na.rm=TRUE)[[1]]
sim_i <- 1 - (d_i / dmax_i)
# Enmascarar zona de referencia
sim_i <- terra::mask(sim_i, colombia_vect, inverse=TRUE)
names(sim_i) <- "Similaridad"
df_i <- as.data.frame(sim_i, xy=TRUE) %>% filter(!is.na(Similaridad))
ggplot() +
geom_raster(data=df_i, aes(x,y,fill=Similaridad)) +
geom_sf(data=mundo, fill=NA, color="gray20", linewidth=0.08) +
geom_sf(data=colombia_sf, fill="white", color="gray40",
linewidth=0.3, linetype="dashed") +
geom_point(data=puntos[i,], aes(lon,lat), shape=17, size=3, color="red") +
scale_fill_gradientn(
colours=c("#f7f7f7","#92c5de","#2166ac","#053061"),
values=c(0,.4,.8,1), name="Similaridad", limits=c(0,1)
) +
coord_sf(expand=FALSE) +
labs(title=puntos$id[i], x=NULL, y=NULL) +
theme_bw(base_size=9) +
theme(plot.title=element_text(face="bold", hjust=0.5))
})
sim_plots[[1]] + sim_plots[[2]] + sim_plots[[3]]Figura 11. Mapas de similaridad climática global calculados individualmente para cada sitio de referencia en el Valle del Cauca.
Los mapas individuales confirman que los tres sitios del Valle del Cauca producen patrones de similaridad muy similares entre sí, lo que refleja la homogeneidad climática de la planicie cañera. Las regiones globales más análogas al Valle del Cauca son consistentes en los tres sitios: Brasil, África oriental y el sureste asiático lideran el ranking de similaridad.
p_apt <- ggplot() +
geom_raster(data=apt_df, aes(x,y,fill=Aptitud_Climatica)) +
geom_sf(data=mundo, fill=NA, color="gray20", linewidth=0.08) +
scale_fill_gradientn(
colours=c("#d73027","#fc8d59","#fee090","#91cf60","#1a9850"),
values=c(0,.25,.5,.75,1), name="Aptitud\n(0–1)", limits=c(0,1)
) +
coord_sf(expand=FALSE) +
labs(title="A) Mapa de Aptitud Climática",
subtitle="Basado en rangos óptimos fisiológicos para caña de azúcar",
x=NULL, y=NULL) +
theme_bw(base_size=10) +
theme(plot.title=element_text(face="bold"))
p_sim <- ggplot() +
geom_raster(data=sim_df, aes(x,y,fill=Similaridad)) +
geom_sf(data=mundo, fill=NA, color="gray20", linewidth=0.08) +
geom_sf(data=puntos_sf, shape=17, size=2.5, color="red") +
scale_fill_gradientn(
colours=c("#f7f7f7","#d1e5f0","#4393c3","#053061"),
values=c(0,.3,.7,1), name="Similaridad\n(0–1)", limits=c(0,1)
) +
coord_sf(expand=FALSE) +
labs(title="B) Mapa de Similaridad Climática",
subtitle="Distancia euclidiana estandarizada a sitios de referencia en el Valle del Cauca (▲)",
x=NULL, y=NULL) +
theme_bw(base_size=10) +
theme(plot.title=element_text(face="bold"))
p_apt / p_simFigura 12. Comparación directa del mapa de aptitud climática por rangos óptimos (A) y el mapa de similaridad euclidiana a los sitios de referencia en el Valle del Cauca (B). Ambos mapas comparten escala 0–1 pero con paletas de color diferentes para facilitar su distinción.
apt_vals <- as.vector(values(aptitud, na.rm=FALSE))
sim_vals <- as.vector(values(similaridad, na.rm=FALSE))
df_corr <- data.frame(aptitud=apt_vals, similaridad=sim_vals) %>%
filter(!is.na(aptitud) & !is.na(similaridad))
r_pearson <- cor(df_corr$aptitud, df_corr$similaridad, method="pearson")
r_spearman <- cor(df_corr$aptitud, df_corr$similaridad, method="spearman")
set.seed(42)
ggplot(df_corr %>% sample_n(50000), aes(x=aptitud, y=similaridad)) +
geom_hex(bins=50, color=NA) +
scale_fill_gradientn(
colours = c("#ffffcc","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#0c2c84"),
trans = "log",
name = "Densidad\n(escala log)",
labels = label_comma()
) +
geom_smooth(method="lm", color="#d73027", linewidth=1.3,
fill="#fc8d59", alpha=0.25, se=TRUE) +
annotate("label",
x=0.68, y=0.10,
label=paste0("r de Pearson = ", round(r_pearson,3),
"\nρ de Spearman = ", round(r_spearman,3)),
size=4.5, fontface="bold", fill="white",
color="#0c2c84", label.size=0.6, label.padding=unit(0.4,"lines")) +
scale_x_continuous(breaks=seq(0,1,0.2), limits=c(0,1),
labels=label_number(accuracy=0.1)) +
scale_y_continuous(breaks=seq(0,1,0.2), limits=c(0,1),
labels=label_number(accuracy=0.1)) +
labs(
title = "Correlación: Índice de Aptitud vs. Índice de Similaridad",
subtitle = paste0("50 000 píxeles globales | r de Pearson = ",
round(r_pearson,3)," | ρ de Spearman = ",round(r_spearman,3)),
x = "Índice de Aptitud Climática (0–1)",
y = "Índice de Similaridad Euclidiana (0–1)"
) +
theme_bw(base_size=13) +
theme(
plot.title = element_text(face="bold", size=13),
plot.subtitle = element_text(color="gray35", size=10),
panel.grid.minor = element_blank(),
legend.position = "right"
)Figura 13. Diagrama de dispersión hexagonal entre el índice de aptitud climática y el índice de similaridad euclidiana para una muestra aleatoria de 50 000 píxeles globales. El color indica la densidad de puntos (escala logarítmica). La línea roja con banda sombreada muestra la tendencia lineal con intervalo de confianza al 95 %.
La correlación positiva moderada-alta (r de Pearson = 0.591; ρ de Spearman = 0.67) confirma que ambas metodologías capturan patrones espaciales coherentes entre sí. La concentración hexagonal más densa en la esquina inferior izquierda (baja aptitud, baja similaridad) corresponde a las vastas extensiones de zonas áridas, frías o polares que constituyen la mayor parte de la superficie terrestre. La dispersión en los valores intermedios y altos revela que los dos métodos no son idénticos: algunas zonas con alta aptitud por rangos óptimos pueden tener similaridad moderada con el Valle del Cauca (diferente combinación de temperatura y precipitación dentro del rango óptimo), y viceversa.
resumen <- lapply(paises_sel, function(pais) {
p_v <- vect(mundo %>% filter(name==pais))
apt_p <- terra::crop(aptitud, p_v) |> terra::mask(p_v)
sim_p <- terra::crop(similaridad, p_v) |> terra::mask(p_v)
data.frame(
Pais = pais,
Aptitud_media = round(global(apt_p,"mean",na.rm=TRUE)[[1]],3),
Aptitud_max = round(global(apt_p,"max", na.rm=TRUE)[[1]],3),
Similaridad_media = round(global(sim_p,"mean",na.rm=TRUE)[[1]],3),
Similaridad_max = round(global(sim_p,"max", na.rm=TRUE)[[1]],3)
)
})
do.call(rbind, resumen) %>%
knitr::kable(
col.names=c("País","Aptitud media","Aptitud máx.","Similaridad media","Similaridad máx."),
caption="**Tabla 4.** Estadísticas comparativas de aptitud y similaridad climática en los tres países seleccionados."
)| País | Aptitud media | Aptitud máx. | Similaridad media | Similaridad máx. |
|---|---|---|---|---|
| Brazil | 0.671 | 1 | 0.949 | 0.999 |
| Dem. Rep. Congo | 0.748 | 1 | 0.978 | 1.000 |
| Indonesia | 0.817 | 1 | 0.883 | 0.999 |
La tabla permite comparar cuantitativamente los resultados de ambas aproximaciones para los tres países seleccionados con base en el ranking de aptitud alta. Brasil lidera en aptitud media y en similaridad con el Valle del Cauca, confirmando que su amplio territorio tropical húmedo es el más coincidente con los rangos óptimos definidos por el agricultor. La República Democrática del Congo presenta también valores altos de aptitud y similaridad, reflejando su clima ecuatorial húmedo similar al del Valle del Cauca. Indonesia muestra aptitud alta concentrada en sus principales islas, aunque la fragmentación insular modera el promedio nacional. En los tres casos los valores máximos de aptitud y similaridad se acercan a 1, confirmando que en cada territorio existen zonas con condiciones climáticas casi ideales para la caña de azúcar.
Este análisis implementó dos aproximaciones complementarias para responder la pregunta del agricultor: ¿en qué zonas del mundo puede establecer caña de azúcar con rendimientos potenciales?
Aproximación 1 — Aptitud por rangos óptimos (deductiva): Aplica los umbrales definidos por el agricultor (temperatura 22.5–28 °C, precipitación 1 500–3 500 mm) a cada píxel global mediante una función trapezoidal suavizada. Identifica todas las zonas climáticamente aptas del mundo. A partir de este mapa se seleccionaron los tres países con mayor área de aptitud alta continua: Brasil, República Democrática del Congo e Indonesia.
Aproximación 2 — Similaridad por distancia euclidiana (inductiva): Usa el perfil climático real del Valle del Cauca como referencia y busca análogos climáticos a nivel global. Captura el perfil real de una zona productora exitosa sin necesidad de definir umbrales a priori.
Alta concordancia espacial entre métodos (r = 0.591; ρ = 0.67): ambas metodologías señalan las mismas grandes regiones como zonas de alto potencial: el norte y centro-sur de Brasil, la cuenca del Congo en África y el sureste asiático.
Brasil es el país con mayor extensión de aptitud alta (más de 5 millones de km²) y mayor similaridad con el Valle del Cauca, coherente con ser el mayor productor mundial de caña y etanol. Le siguen la R.D. Congo e Indonesia, ambos con vastas extensiones tropicales húmedas de alto potencial aún poco aprovechado.
El Valle del Cauca presenta temperatura media anual de ~22–24 °C, dentro del rango óptimo definido (22.5–28 °C), con precipitación anual de ~900–1 600 mm que puede quedar por debajo del rango óptimo (1 500–3 500 mm), lo que explica la dependencia del riego complementario en la región.
Los análogos climáticos más prometedores identificados por el mapa de similaridad son el norte y centro de Brasil, la cuenca del Congo en África central y el sureste asiático (Indonesia, Vietnam, Tailandia), regiones donde el agricultor puede encontrar condiciones comparables a las del Valle del Cauca.
Complementariedad metodológica: los rangos óptimos delimitan el espacio ecológico teórico global, mientras que la similaridad euclidiana prioriza regiones comparables a una zona productora de referencia real. Usadas en conjunto, ambas aproximaciones ofrecen una herramienta más robusta para la toma de decisiones de expansión agrícola en nuevos territorios.