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")
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()

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()

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
🌍 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)
)
🏝️ 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)
)
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)
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
))