#Riqueza de especies del género Megachile en Guatemala
Megachile es un género de abejas en la familia Megachilidae. Son de distribución cosmopolita, son abejas solitarias, a menudo denominadas abejas cortadoras de hojas aunque no todas cortan hojas.
Hacen nidos en troncos de árboles huecos o estructuras similares pero también en agujeros en el suelo. La hembra pone un huevo en cada celda del nido con una provisión de polen o una mezcla de néctar y polen. Los machos son de menor tamaño que las hembras y emergen antes que las hembras pero mueren después del apareamiento.
Megachile sp.
Carga de datos y preparación de variables para obtener resultados de distribución del género en Guatemala y su relacion con la temperatura.¶
# Carga de geopandas con el alias gdp
import geopandas as gpd
# Carga de pandas con el alias pd
import pandas as pd
# Carga de folium
import folium
# Carga de matplotlib
import matplotlib.pyplot as plt
# Biblioteca requerida para mapas interactivos
!pip install mapclassify --quiet
import mapclassify
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/59.1 kB ? eta -:--:-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 59.1/59.1 kB 2.4 MB/s eta 0:00:00
# Instalación de rasterio
!pip install rasterio --quiet
# Carga de rasterio
import rasterio
# Carga de rasterio.plot (para graficar datos raster)
import rasterio.plot
# Carga de numpy (para álgebra lineal)
import numpy as np
# Carga de matplotlib.pyplot
import matplotlib.pyplot as plt
# Crear un DataFrame con registros de presencia de megachile
megachile_df = pd.read_csv ("occurrences.csv")
# Crear un GeoDataFrame a partir del DataFrame
megachile_gdf = gpd.GeoDataFrame(
megachile_df,
geometry=gpd.points_from_xy(megachile_df.decimalLongitude, megachile_df.decimalLatitude),
crs='EPSG:4326'
)
# Mostrar los primeros registros del GeoDataFrame,
# incluyendo la columna de geometría
megachile_gdf[['recordID', 'scientificName', 'decimalLongitude', 'decimalLatitude', 'geometry']].head()
recordID | scientificName | decimalLongitude | decimalLatitude | geometry | |
---|---|---|---|---|---|
0 | 699b228f-0623-4416-a4e3-e11ceb74d26c | Megachile | -90.283333 | 15.233333 | POINT (-90.28333 15.23333) |
1 | e5440ff7-2891-4422-bad3-eb2106721154 | Megachile | -90.100000 | 15.100000 | POINT (-90.1 15.1) |
2 | 28ef7635-8ac3-41b9-a93b-7fae4711eb36 | Megachile | -90.100000 | 15.100000 | POINT (-90.1 15.1) |
3 | 36bfd84f-48f8-468a-b449-8f6c00404570 | Megachile | -90.100000 | 15.100000 | POINT (-90.1 15.1) |
4 | 51c94fb0-8a9f-4c02-b277-e4f82e9f691a | Megachile | -91.566667 | 14.650000 | POINT (-91.56667 14.65) |
# Crear un geodataframe con datos y polígonos de paises
paises_gdf = gpd.read_file(
'https://raw.githubusercontent.com/datos-geoespaciales-biodiversidad/python/refs/heads/main/datos/otros/naturalearth/paises.gpkg'
)
# Mostrar los primeros registros del GeoDataFrame,
# incluyendo la columna de geometría
paises_gdf[['ADM0_ISO', 'NAME', 'POP_EST', 'GDP_MD', 'geometry']].head()
ADM0_ISO | NAME | POP_EST | GDP_MD | geometry | |
---|---|---|---|---|---|
0 | FJI | Fiji | 889953.0 | 5496 | MULTIPOLYGON (((180 -16.06713, 180 -16.55522, ... |
1 | TZA | Tanzania | 58005463.0 | 63177 | MULTIPOLYGON (((33.90371 -0.95, 34.07262 -1.05... |
2 | B28 | W. Sahara | 603253.0 | 907 | MULTIPOLYGON (((-8.66559 27.65643, -8.66512 27... |
3 | CAN | Canada | 37589262.0 | 1736425 | MULTIPOLYGON (((-122.84 49, -122.97421 49.0025... |
4 | USA | United States of America | 328239523.0 | 21433226 | MULTIPOLYGON (((-122.84 49, -120 49, -117.0312... |
# Carga de datos de temperatura media anual
temperatura_media_anual = rasterio.open(
'https://github.com/datos-geoespaciales-biodiversidad/python/raw/refs/heads/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_1.tif'
)
print(temperatura_media_anual)
<open DatasetReader name='https://github.com/datos-geoespaciales-biodiversidad/python/raw/refs/heads/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_1.tif' mode='r'>
Distribución del genero Megachile en Gutemala y su relacion con la temperatura¶
La distribución del género Megachile en Guatemala está restringida a la zona media del país, dentro de un rango de temperatura de 16 a 25 °C. Sin embargo, es posible que su presencia en otras regiones no haya sido reportada debido a la falta de muestreos.
# Create the figure and axes for the temperature map
fig, ax = plt.subplots(figsize=(8, 8))
# Plot the annual mean temperature map
rasterio.plot.show(
temperatura_media_anual,
cmap="coolwarm",
ax=ax,
title="Distribucion del género Megachile en Guatemala",
vmin=10, # Set minimum temperature to 10°C
vmax=30 # Set maximum temperature to 30°C
)
# Add a colorbar for the temperature scale
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.8)
cbar.set_label('°C')
# Plot the Guatemala boundary on top of the temperature map
paises_gdf[(paises_gdf['NAME'] == 'Guatemala')].plot(
ax=ax, # Use the same axes as the temperature map
color="none", # Make the country fill transparent
edgecolor="black", # Outline the country in black
linewidth=1.5 # Make the outline slightly thicker
)
# Plot the Megachile occurrence points on the same axes
megachile_gdf[megachile_gdf['scientificName'] != 'Megachile'].plot(
ax=ax, # Use the same axes as the temperature map
marker="o",
color="red",
markersize=5
)
# Set the limits to focus on Guatemala
# You might need to adjust these values based on Guatemala's coordinates
ax.set_xlim(megachile_gdf.total_bounds[0]-1, megachile_gdf.total_bounds[2]+1)
ax.set_ylim(megachile_gdf.total_bounds[1]-1, megachile_gdf.total_bounds[3]+1)
# Show the plot
plt.show()
/usr/local/lib/python3.11/dist-packages/matplotlib/colors.py:777: RuntimeWarning: overflow encountered in multiply xa *= self.N /usr/local/lib/python3.11/dist-packages/matplotlib/colors.py:777: RuntimeWarning: overflow encountered in multiply xa *= self.N /usr/local/lib/python3.11/dist-packages/matplotlib/colors.py:777: RuntimeWarning: overflow encountered in multiply xa *= self.N
Relación entre distribución y temperatura de las diferentes especies del género en Guatemala.¶
def obtener_temperatura(row):
"""Extrae el valor de temperatura del raster en un punto dado."""
x = row.geometry.x
y = row.geometry.y
row, col = temperatura_media_anual.index(x, y)
temp = temperatura_media_anual.read(1, window=((row, row + 1), (col, col + 1)))[0, 0]
return temp
megachile_gdf['temperatura_promedio'] = megachile_gdf.apply(obtener_temperatura, axis=1)
temperatura_promedio_especie = megachile_gdf.groupby('scientificName')['temperatura_promedio'].mean().reset_index()
# ocurrencias por especie.
conteo_individuos_especies = megachile_gdf.groupby("scientificName")['scientificName'].count()
# Convertir la serie a dataframe
conteo_individuos_especies = conteo_individuos_especies.reset_index(name='especies_megachile')
# Eliminar filas donde 'scientificName' sea 'Megachile'
megachile_gdf = megachile_gdf[megachile_gdf['scientificName'] != 'Megachile']
# Unir la tabla de conteo de especies con los datos de temperatura
conteo_individuos_especies = conteo_individuos_especies.merge(temperatura_promedio_especie, on='scientificName', how='left')
# Despliegue de países y cantidades de especies
conteo_individuos_especies.sort_values(by="especies_megachile", ascending=False)
scientificName | especies_megachile | temperatura_promedio | |
---|---|---|---|
17 | Megachile otomita | 141 | 20.721785 |
19 | Megachile tepaneca | 18 | 18.801199 |
9 | Megachile elongata | 15 | 19.253660 |
20 | Megachile toluca | 12 | 21.504309 |
6 | Megachile chichimeca | 11 | 21.044222 |
23 | Megachile zapoteca | 7 | 21.093578 |
24 | Megachile zexmeniae | 7 | 19.830523 |
15 | Megachile montezuma | 5 | 21.222250 |
16 | Megachile nigripennis | 4 | 22.647938 |
18 | Megachile policaris | 3 | 19.015156 |
8 | Megachile coelioxoides | 3 | 20.037735 |
2 | Megachile aurantipennis | 3 | 23.131210 |
7 | Megachile clara | 3 | 19.895098 |
12 | Megachile frugalis | 2 | 19.015156 |
11 | Megachile flavihirsuta | 2 | 19.015156 |
0 | Megachile albitarsis | 1 | 19.015156 |
4 | Megachile bidentis | 1 | 25.826994 |
5 | Megachile candida | 1 | 19.015156 |
1 | Megachile antiqua | 1 | 16.799938 |
3 | Megachile azteca | 1 | 20.116167 |
10 | Megachile exaltata | 1 | 18.587240 |
13 | Megachile gualanensis | 1 | 25.356104 |
14 | Megachile habilis | 1 | 22.082895 |
22 | Megachile viator | 1 | 22.082895 |
21 | Megachile vestis | 1 | 22.082895 |
Gráfico de barras sobre la riqueza de especies reportadas del género Megachile en Guatemala¶
import matplotlib.pyplot as plt
import numpy as np
# Obtener los nombres científicos de las especies
scientific_names = conteo_individuos_especies['scientificName']
# Obtener los conteos de cada especie
conteos = conteo_individuos_especies['especies_megachile']
# Crear la figura y los ejes
plt.figure(figsize=(12, 6))
# Crear el gráfico de barras
scientific_names_pos = np.arange(len(scientific_names)) # Posiciones de las barras
plt.bar(scientific_names_pos, conteos, width=0.6) # Crear las barras
# Configurar las etiquetas del eje x
plt.xticks(scientific_names_pos, scientific_names, rotation=45, ha='right', fontsize=10)
# Configurar las etiquetas de los ejes y el título
plt.xlabel("Especie")
plt.ylabel("Número de individuos")
plt.title("Riqueza de especies del género Megachile en Guatemala")
# Ajustar el diseño para evitar superposiciones
plt.tight_layout()
# Mostrar el gráfico
plt.show()
Mapas interactivos¶
import folium
# Crear un mapa base centrado en Guatemala
m = paises_gdf[(paises_gdf['NAME'] == 'Guatemala')].explore(
name='Guatemala',
tooltip=['ADM0_ISO', 'NAME'],
legend=False
)
# Agregar marcadores para las especies con información de temperatura
for index, row in megachile_gdf.iterrows():
folium.Marker(
location=[row.geometry.y, row.geometry.x],
popup=f"Especie: {row['scientificName']}<br>Temperatura: {row['temperatura_promedio']}°C",
icon=folium.Icon(color="blue", icon="info-sign")
).add_to(m)
# Mostrar el mapa interactivo
m
# Fusionar los conteos de especies con los datos espaciales
# Usar sufijos para evitar conflictos de nombres de columna
megachile_gdf = megachile_gdf.merge(conteo_individuos_especies, on='scientificName', how='left', suffixes=('_left', '_right'))
# Renombrar la columna 'especies_megachile_right' a 'especies_megachile'
megachile_gdf.rename(columns={'especies_megachile_right': 'especies_megachile'}, inplace=True)
# Crear mapa interactivo
m = paises_gdf[(paises_gdf['NAME'] == 'Guatemala')].explore(
name='Guatemala',
tooltip=['ADM0_ISO', 'NAME'],
legend=False
)
megachile_gdf.explore(
m=m,
column='scientificName',
name='Registros de Megachile',
marker_type='circle',
marker_kwds={'radius': 5, 'color': 'blue'},
tooltip=['scientificName', 'especies_megachile'], # Include species count in the tooltip
popup=True
)
# Add layer control
folium.LayerControl().add_to(m)
# Display the map
m