#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. Imagen remota

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.¶

In [ ]:
# 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
In [ ]:
# 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
In [ ]:
# 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()
Out[ ]:
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)
In [ ]:
# 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()
Out[ ]:
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...
In [ ]:
# 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.

In [ ]:
# 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
No description has been provided for this image
In [ ]:

Relación entre distribución y temperatura de las diferentes especies del género en Guatemala.¶

In [ ]:
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)
Out[ ]:
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¶

In [ ]:
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()
No description has been provided for this image

Mapas interactivos¶

In [ ]:
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
Out[ ]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [ ]:
# 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
Out[ ]:
Make this Notebook Trusted to load map: File -> Trust Notebook