library(sf)
## Warning: package 'sf' was built under R version 4.5.3
## Linking to GEOS 3.14.1, GDAL 3.12.1, PROJ 9.7.1; sf_use_s2() is TRUE
library(geodata)
## Warning: package 'geodata' was built under R version 4.5.3
## Loading required package: terra
## Warning: package 'terra' was built under R version 4.5.3
## terra 1.9.25
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:terra':
##
## intersect, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
sf::sf_use_s2(FALSE)
## Spherical geometry (s2) switched off
# Permanent map folder
map_path <- "philippines_map"
# Load from saved local file if it already exists
local_file <- file.path(map_path, "gadm41_PHL_1_pk.rds")
if (file.exists(local_file)) {
ph <- readRDS(local_file)
} else {
dir.create(map_path, showWarnings = FALSE)
ph <- geodata::gadm(
country = "PHL",
level = 1,
path = map_path
)
saveRDS(ph, local_file)
}
## Cached as: philippines_map/gadm/gadm41_PHL_1_pk.rds
ph <- st_as_sf(ph)
ph <- st_make_valid(ph)
print(sort(unique(ph$NAME_1)))
## [1] "Abra" "Agusan del Norte" "Agusan del Sur"
## [4] "Aklan" "Albay" "Antique"
## [7] "Apayao" "Aurora" "Basilan"
## [10] "Bataan" "Batanes" "Batangas"
## [13] "Benguet" "Biliran" "Bohol"
## [16] "Bukidnon" "Bulacan" "Cagayan"
## [19] "Camarines Norte" "Camarines Sur" "Camiguin"
## [22] "Capiz" "Catanduanes" "Cavite"
## [25] "Cebu" "Compostela Valley" "Davao del Norte"
## [28] "Davao del Sur" "Davao Oriental" "Dinagat Islands"
## [31] "Eastern Samar" "Guimaras" "Ifugao"
## [34] "Ilocos Norte" "Ilocos Sur" "Iloilo"
## [37] "Isabela" "Kalinga" "La Union"
## [40] "Laguna" "Lanao del Norte" "Lanao del Sur"
## [43] "Leyte" "Maguindanao" "Marinduque"
## [46] "Masbate" "Metropolitan Manila" "Misamis Occidental"
## [49] "Misamis Oriental" "Mountain Province" "Negros Occidental"
## [52] "Negros Oriental" "North Cotabato" "Northern Samar"
## [55] "Nueva Ecija" "Nueva Vizcaya" "Occidental Mindoro"
## [58] "Oriental Mindoro" "Palawan" "Pampanga"
## [61] "Pangasinan" "Quezon" "Quirino"
## [64] "Rizal" "Romblon" "Samar"
## [67] "Sarangani" "Siquijor" "Sorsogon"
## [70] "South Cotabato" "Southern Leyte" "Sultan Kudarat"
## [73] "Sulu" "Surigao del Norte" "Surigao del Sur"
## [76] "Tarlac" "Tawi-Tawi" "Zambales"
## [79] "Zamboanga del Norte" "Zamboanga del Sur" "Zamboanga Sibugay"
original_classification <- data.frame(
NAME_1 = c(
"Davao del Norte", "Davao del Sur", "Davao Oriental",
"Bukidnon", "Cotabato", "South Cotabato",
"Guimaras", "Pangasinan", "Ilocos Norte", "Ilocos Sur", "Zambales",
"Batangas", "Laguna", "Quezon", "Cavite", "Albay",
"Benguet", "Mountain Province", "Nueva Vizcaya"
),
suitability_group = c(
rep("Clade 3-associated humid tropical fruits\n(Durian, Papaya)", 3),
rep("Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)", 3),
rep("Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)", 5),
rep("Lowland mixed suitability\n(Clade 1 + Clade 2 species)", 5),
rep("Upland/subtropical suitability\n(Avocado, Mandarin)", 3)
),
prediction_type = "Original literature-based classification"
)
secondary_prediction <- data.frame(
NAME_1 = c(
"Abra", "Agusan del Norte", "Agusan del Sur", "Aklan", "Antique",
"Apayao", "Aurora", "Bataan", "Batanes", "Biliran", "Bohol",
"Bulacan", "Cagayan", "Camarines Norte", "Camarines Sur",
"Camiguin", "Capiz", "Catanduanes", "Cebu", "Davao Occidental",
"Compostela Valley", "Dinagat Islands", "Eastern Samar", "Ifugao",
"Iloilo", "Isabela", "Kalinga", "La Union", "Lanao del Norte",
"Lanao del Sur", "Leyte", "Maguindanao", "Marinduque", "Masbate",
"Misamis Occidental", "Misamis Oriental", "Metropolitan Manila",
"Negros Occidental", "Negros Oriental", "Northern Samar",
"Nueva Ecija", "Occidental Mindoro", "Oriental Mindoro", "Palawan",
"Pampanga", "Quirino", "Rizal", "Romblon", "Samar", "Sarangani",
"Siquijor", "Sorsogon", "Sultan Kudarat", "Surigao del Norte",
"Surigao del Sur", "Tarlac", "Tawi-Tawi", "Zamboanga del Norte",
"Zamboanga del Sur", "Zamboanga Sibugay"
),
suitability_group = c(
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 3-associated humid tropical fruits\n(Durian, Papaya)",
"Clade 3-associated humid tropical fruits\n(Durian, Papaya)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 3-associated humid tropical fruits\n(Durian, Papaya)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 3-associated humid tropical fruits\n(Durian, Papaya)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Clade 3-associated humid tropical fruits\n(Durian, Papaya)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)"
),
prediction_type = "Secondary predicted classification"
)
combined_suitability <- bind_rows(
original_classification,
secondary_prediction
)
map_data <- ph %>%
left_join(combined_suitability, by = "NAME_1") %>%
mutate(
suitability_group = ifelse(is.na(suitability_group),
"Still not classified",
suitability_group),
prediction_type = ifelse(is.na(prediction_type),
"Still not classified",
prediction_type),
suitability_group = factor(
suitability_group,
levels = c(
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)",
"Clade 3-associated humid tropical fruits\n(Durian, Papaya)",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)",
"Upland/subtropical suitability\n(Avocado, Mandarin)",
"Still not classified"
)
)
)
secondary_prediction_map <- ggplot(map_data) +
geom_sf(
aes(fill = suitability_group),
color = "white",
linewidth = 0.2
) +
scale_fill_manual(
values = c(
"Clade 1 mixed humid tropical fruits\n(Banana, Pineapple, Avocado, Soursop, Guava)" = "#66BB6A",
"Clade 2 seasonal/rainforest tropical fruits\n(Mango, Jackfruit, Mandarin, Rambutan)" = "#F9A825",
"Clade 3-associated humid tropical fruits\n(Durian, Papaya)" = "#2E7D32",
"Lowland mixed suitability\n(Clade 1 + Clade 2 species)" = "#EF6C00",
"Upland/subtropical suitability\n(Avocado, Mandarin)" = "#64B5F6",
"Still not classified" = "gray90"
),
drop = FALSE
) +
labs(
title = "Secondary Predicted Provincial Climate Suitability of Selected Tropical Fruit Groups",
subtitle = "Previously unclassified provinces were assigned using climate similarity and clade-associated fruit preferences",
fill = "Predicted Suitable Fruit Group",
caption = "Note: This map represents climate-based predicted suitability only. It does not confirm actual fruit occurrence or cultivation records."
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 9),
legend.position = "right",
legend.title = element_text(face = "bold", size = 10),
legend.text = element_text(size = 8),
axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank()
)
secondary_prediction_map
