0.1 1. Carga y limpieza de datos

# Leer datos
df <- read_excel("Localidades_aves.xlsx", col_types = "text")
# Renombrar columna si viene como "tipo 2 (Natural/Artificial)"
names(df) <- gsub("tipo 2 \\(Natural/Artificial\\)", "tipo_2_NaturalArtificial", names(df))
# Renombrar columna problemática
names(df) <- str_replace_all(names(df), "\\s*\\(.*\\)", "")
names(df) <- str_replace_all(names(df), "\\s+", "_")
names(df) <- str_replace_all(names(df), "\\/", "_")

# Forzar a factores importantes
df <- df %>%
  mutate(across(where(is.character), as.factor)) %>%
  mutate(Abundancia = 1)

# Filtrar Tirajana
tirajana_munis <- c("San Bartolomé de Tirajana", "Santa Lucía de Tirajana", 
                    "San Bartolomé de Tirajana y Santa Lucía de Tirajana")
df$Region <- ifelse(df$Aves_Municipio %in% tirajana_munis, "Tirajana", "Resto")

0.2 2. Cálculo de métricas comunitarias

tabla <- df %>%
  group_by(Aves_Localidad, Especie) %>%
  summarise(Abundancia = sum(Abundancia), .groups = "drop") %>%
  pivot_wider(names_from = Especie, values_from = Abundancia, values_fill = 0)

localidades <- tabla$Aves_Localidad
matriz <- as.data.frame(tabla[,-1])
rownames(matriz) <- localidades

riqueza <- rowSums(matriz > 0)
abundancia_total <- rowSums(matriz)
shannon <- diversity(matriz, index = "shannon")
evenness <- shannon / log(riqueza)

resumen <- data.frame(Localidad = rownames(matriz), Riqueza = riqueza,
                      Abundancia_Total = abundancia_total,
                      Shannon = round(shannon, 3),
                      Evenness = round(evenness, 3))

0.3 3. Agregación por isla y comparación con Tirajana

df_metrics <- df %>%
  select(Localidades_Isla, Aves_Localidad) %>%
  distinct() %>%
  left_join(resumen, by = c("Aves_Localidad" = "Localidad")) %>%
  mutate(Region = ifelse(Localidades_Isla == "Gran Canaria" & Aves_Localidad %in% resumen$Localidad[resumen$Localidad %in% df$Aves_Localidad[df$Region == "Tirajana"]], 
                         "Tirajana", as.character(Localidades_Isla)))

df_long <- df_metrics %>%
  pivot_longer(cols = c(Riqueza, Abundancia_Total, Shannon, Evenness),
               names_to = "Métrica", values_to = "Valor") %>%
  filter(!is.na(Valor))

0.4 4. Comparativas gráficas entre islas y Tirajana

ggplot(df_long, aes(x = Region, y = Valor, fill = Region)) +
  geom_boxplot() +
  facet_wrap(~Métrica, scales = "free") +
  stat_compare_means(method = "kruskal.test", label = "p.signif") +
  labs(title = "Comparativa de métricas entre Tirajana y otras islas",
       x = "Región o isla", y = "Valor") +
  theme_minimal()

0.5 5. Comparativa por tipo de charca (Natural vs Artificial)

df_tipo <- df %>%
  select(Aves_Localidad, tipo_2_NaturalArtificial) %>%
  distinct() %>%
  left_join(resumen, by = c("Aves_Localidad" = "Localidad"))

df_tipo_long <- df_tipo %>%
  pivot_longer(cols = c(Riqueza, Abundancia_Total, Shannon, Evenness),
               names_to = "Métrica", values_to = "Valor") %>%
  filter(!is.na(Valor))

ggplot(df_tipo_long, aes(x = tipo_2_NaturalArtificial, y = Valor, fill = tipo_2_NaturalArtificial)) +
  geom_boxplot() +
  facet_wrap(~Métrica, scales = "free") +
  stat_compare_means(method = "wilcox.test", label = "p.signif") +
  labs(title = "Comparativa de métricas por tipo de charca (global)",
       x = "Tipo de charca", y = "Valor") +
  theme_minimal()

0.6 6. Comparativa por tipo solo en Tirajana

df_tipo_tirajana <- df %>%
  filter(Region == "Tirajana") %>%
  select(Aves_Localidad, tipo_2_NaturalArtificial) %>%
  distinct() %>%
  left_join(resumen, by = c("Aves_Localidad" = "Localidad"))

df_tipo_tirajana_long <- df_tipo_tirajana %>%
  pivot_longer(cols = c(Riqueza, Abundancia_Total, Shannon, Evenness),
               names_to = "Métrica", values_to = "Valor") %>%
  filter(!is.na(Valor))

ggplot(df_tipo_tirajana_long, aes(x = tipo_2_NaturalArtificial, y = Valor, fill = tipo_2_NaturalArtificial)) +
  geom_boxplot() +
  facet_wrap(~Métrica, scales = "free") +
  stat_compare_means(method = "wilcox.test", label = "p.signif") +
  labs(title = "Comparativa en Tirajana por tipo de charca",
       x = "Tipo", y = "Valor") +
  theme_minimal()

1 Mapas Interactivos

# Cargar shapefile de todas las islas
gran_canaria_sf <- st_read("islas_20170101_generalizada.shp") %>%
  st_transform(4326)
## Reading layer `islas_20170101_generalizada' from data source 
##   `C:\Users\Usuario\OneDrive - SEO BirdLife\Documentos\Barranco_Tijarana\islas_20170101_generalizada.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 7 features and 15 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -18.16083 ymin: 27.63773 xmax: -13.33512 ymax: 29.41606
## Geodetic CRS:  WGS 84
# Cargar datos de Excel
df_total_acuaticas <- read_excel('Localidades_aves.xlsx', col_types = 'text')

# Normalizar nombres de columnas
limpiar_nombres <- function(nombres) {
  nombres <- iconv(nombres, from = "UTF-8", to = "ASCII//TRANSLIT")
  nombres <- stringr::str_replace_all(nombres, "º|/|\\\\", "")
  nombres <- stringr::str_replace_all(nombres, "\\s+", "_")
  nombres <- stringr::str_replace_all(nombres, "[^A-Za-z0-9_]", "")
  return(nombres)
}
colnames(df_total_acuaticas) <- limpiar_nombres(colnames(df_total_acuaticas))

df_total_acuaticas$Abundancia <- 1

# Cálculo de métricas comunitarias
tabla <- df_total_acuaticas %>%
  group_by(Aves_Localidad, Especie) %>%
  summarise(Abundancia = sum(Abundancia), .groups = "drop") %>%
  pivot_wider(names_from = Especie , values_from = Abundancia, values_fill = 0)

localidades <- tabla$Aves_Localidad
matriz <- as.data.frame(tabla[, -1])
rownames(matriz) <- localidades

riqueza <- rowSums(matriz > 0)
abundancia_total <- rowSums(matriz)
riqueza[riqueza <= 0] <- NA
shannon <- diversity(matriz, index = "shannon")
evenness <- shannon / log(riqueza)

resumen <- data.frame(
  Localidad = localidades,
  Riqueza = riqueza,
  Abundancia_Total = abundancia_total,
  Shannon = round(shannon, 3),
  Evenness = round(evenness, 3)
)

# Unión con coordenadas
Sub_df <- df_total_acuaticas %>%
  mutate(
    Coord_X = suppressWarnings(as.numeric(as.character(Coord_X))),
    Coord_Y = suppressWarnings(as.numeric(as.character(Coord_Y)))
  ) %>%
  rename(Localidad = Aves_Localidad) %>%
  select(Localidad, Especie, Coord_X, Coord_Y, tipo_2_NaturalArtificial, Aves_Municipio)

merged <- right_join(resumen, Sub_df, by = "Localidad") %>%
  unique() %>%
  filter(!is.na(Coord_X), !is.na(Coord_Y))

df_sf <- st_as_sf(merged, coords = c("Coord_X", "Coord_Y"), crs = 32628) %>%
  st_transform(4326)

charca_especies <- merged %>%
  group_by(Localidad) %>%
  summarise(especies = paste0("<i>", paste(unique(Especie), collapse = ", "), "</i>"))

df_sf <- df_sf %>%
  left_join(charca_especies, by = "Localidad")
df <- df %>%
  mutate(Isla = Localidades_Isla)
familias <- df %>%
  group_by(Isla, Familia) %>%
  summarise(Abundancia = sum(Abundancia)) %>%
  group_by(Isla) %>%
  top_n(5, Abundancia) %>%
  arrange(Isla, desc(Abundancia))

print(familias)
## # A tibble: 45 × 3
## # Groups:   Isla [9]
##    Isla          Familia      Abundancia
##    <fct>         <fct>             <dbl>
##  1 El Hierro     Laridae              53
##  2 El Hierro     Scolopacidae         40
##  3 El Hierro     Ardeidae             16
##  4 El Hierro     Anatidae             10
##  5 El Hierro     Motacillidae          9
##  6 Fuerteventura Scolopacidae        716
##  7 Fuerteventura Charadriidae        475
##  8 Fuerteventura Laridae             369
##  9 Fuerteventura Ardeidae            323
## 10 Fuerteventura Anatidae            289
## # ℹ 35 more rows

1.1 🌍 Mapa interactivo: Todas las islas

leaflet(df_sf) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = gran_canaria_sf, color = "black", weight = 1, fillOpacity = 0.1) %>%
  addCircleMarkers(
    radius = 6,
    fillColor = "blue",
    fillOpacity = 0.6,
    stroke = TRUE,
    color = "black",
    popup = ~paste0("<b>Charca:</b> ", Localidad,
                    "<br><b>Municipio:</b> ", Aves_Municipio,
                    "<br><b>Tipo:</b> ", tipo_2_NaturalArtificial,
                    "<br><b>Riqueza:</b> ", Riqueza,
                    "<br><b>Abundancia:</b> ", Abundancia_Total,
                    "<br><b>Shannon:</b> ", Shannon,
                    "<br><b>Evenness:</b> ", Evenness,
                    "<br><b>Especies:</b><br>", especies)
  )

1.2 🏝️ Mapa exclusivo: Gran Canaria - Barranco de Tirajana

tirajana_municipios <- c("San Bartolomé de Tirajana", "Santa Lucía de Tirajana", "San Bartolomé de Tirajana y Santa Lucía de Tirajana")
df_tirajana <- df_sf %>% filter(Aves_Municipio %in% tirajana_municipios)

leaflet(df_tirajana) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = gran_canaria_sf, color = "black", weight = 1, fillOpacity = 0.1) %>%
  addCircleMarkers(
    radius = 6,
    fillColor = "darkred",
    fillOpacity = 0.7,
    stroke = TRUE,
    color = "black",
    popup = ~paste0("<b>Charca:</b> ", Localidad,
                    "<br><b>Municipio:</b> ", Aves_Municipio,
                    "<br><b>Tipo:</b> ", tipo_2_NaturalArtificial,
                    "<br><b>Riqueza:</b> ", Riqueza,
                    "<br><b>Abundancia:</b> ", Abundancia_Total,
                    "<br><b>Shannon:</b> ", Shannon,
                    "<br><b>Evenness:</b> ", Evenness,
                    "<br><b>Especies:</b><br>", especies)
  )

1.3 Filtrado: Especies de Costa

df_costa <- df %>%
  filter(Tipo_1 == "Costa")

tabla_costa <- df_costa %>%
  group_by(Aves_Localidad, Isla, tipo_2_NaturalArtificial, Especie, RN2000, ENP, ZEC, Status_1, Status_2) %>%
  summarise(Abundancia = sum(Abundancia), .groups = "drop")

head(tabla_costa)

1.4 Descarga personalizada por charca

library(DT)

# Crear tabla resumen por charca incluyendo variables de conservación y estatus
charcas_info <- df_costa %>%
  group_by(Aves_Localidad, Isla, tipo_2_NaturalArtificial, RN2000, ENP, ZEC, Status_1, Status_2) %>%
  summarise(Especies = n_distinct(Especie), Total_Abundancia = sum(Abundancia), .groups = "drop")

datatable(charcas_info, extensions = 'Buttons', options = list(
  dom = 'Bfrtip',
  buttons = c('copy', 'csv', 'excel', 'pdf', 'print'),
  pageLength = 10
))