Resumen¶

El presente estudio consiste en una aproximación biogeográfica de la especie Brosimun alicastrum SW, retomando su respectiva distribución en países de América Latina. Es considerada como una especie multipropósito, adquiere su funcionalidad a partir del uso y técnicas de aprovechamiento en distintas comunidades. Se pretende análisar la distribución actual del ojoche y aproximarse al aprovechamiento que genera esta especie a nivel a las comunidades y soberanía alimentaria.¶

(Brosimum alicastrum) Imagen de adaptación

Metodología¶

El estudio se basa en los datos del Sistema Global de Información sobre Biodiversidad GBIF red internacional e infraestructura de datos financiada por los gobiernos del mundo para dar a cualquiera, en cualquier lugar, acceso abierto a datos sobre todas las formas de vida en la Tierra.¶

Los datos son parte del trabajo colaborativo con registros de la población de las comunidades vinculada o consciente de integrar la información, para un total de 14220 de especies de ojoche encontradas.¶

Distribución geográfica¶

In [ ]:
pip install tabulate
Requirement already satisfied: tabulate in /usr/local/lib/python3.11/dist-packages (0.9.0)

Aprovechamiento del Ojoche¶

Aprovechamiento Estructura
1. Follaje.
2. Medicina.
3. Alimentos.
Hojas, semillas.
Semillas, corteza,latex.
Agua.

Variedades de ojoche¶

In [ ]:
# Import the tabulate module
from tabulate import tabulate

# Sample data: list of lists
data = [
    ["Reino", "Plantae"],
    ["Filo", "Tracheophyta"],
    ["Clase", "Magnoliopsida"]
]

# Creating a table with headers and a grid format
table = tabulate(
    data,
    headers=["Clasificación", "NOmbre"],
    tablefmt="grid"
)

print(table)
+-----------------+---------------+
| Clasificación   | NOmbre        |
+=================+===============+
| Reino           | Plantae       |
+-----------------+---------------+
| Filo            | Tracheophyta  |
+-----------------+---------------+
| Clase           | Magnoliopsida |
+-----------------+---------------+
In [ ]:
import geopandas as gpd
In [ ]:
# Carga de pandas con el alias pd
import pandas as pd

# Carga de folium
import folium

# Carga de matplotlib
import matplotlib.pyplot as plt
In [ ]:
# Biblioteca requerida para mapas interactivos
!pip install mapclassify --quiet

import mapclassify
In [ ]:
# Montaje de Google Drive en Colab
from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
In [ ]:
# Carga de un archivo CSV desde Google Drive
ojoche = pd.read_csv(
    "/content/drive/MyDrive/Colab Notebooks/ojoche.csv",
    sep="\t"
)
# Despliegue de los últimos registros
ojoche.tail(10)
Out[ ]:
gbifID datasetKey occurrenceID kingdom phylum class order family genus species ... identifiedBy dateIdentified license rightsHolder recordedBy typeStatus establishmentMeans lastInterpreted mediaType issue
14197 1038454392 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.282Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14198 1038454387 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.309Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14199 1038454380 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.280Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14200 1038454309 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.161Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14201 1038454280 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.147Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14202 1038454244 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.214Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14203 1038454193 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.204Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14204 1038454180 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:OBSERVACIONHUMANA:I2D... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.206Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14205 1038454149 99b1c33f-113b-4477-8075-a9bbe5df0246 IAvH:BICUB:MAGNOLIOPHYTA:ESPECIMENPRESERVADO:I... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UTP Dorian Ruiz Penagos NaN NaN 2025-02-06T18:17:13.165Z NaN GEODETIC_DATUM_ASSUMED_WGS84;CONTINENT_DERIVED...
14206 1030510718 bd910e78-7a69-44ac-9450-65bf41329604 IAvH:BICUB:TOLIMA:PLANTAE:OBSERVACIONHUMANA:I2... Plantae Tracheophyta Magnoliopsida Rosales Moraceae Brosimum Brosimum alicastrum ... NaN NaN CC_BY_NC_4_0 UD Roy Gonzalez-M.;Jhon Nieto;Daniel García NaN NaN 2025-02-06T18:26:18.704Z NaN COORDINATE_ROUNDED;GEODETIC_DATUM_ASSUMED_WGS8...

10 rows × 50 columns

In [ ]:
# Crear un GeoDataFrame a partir del DataFrame
ojoche= gpd.GeoDataFrame(
    ojoche,
    geometry=gpd.points_from_xy(ojoche.decimalLongitude, ojoche.decimalLatitude),
    crs='EPSG:4326'
)
In [ ]:
# Información general sobre un dataframe
ojoche.info()
<class 'geopandas.geodataframe.GeoDataFrame'>
RangeIndex: 14207 entries, 0 to 14206
Data columns (total 51 columns):
 #   Column                            Non-Null Count  Dtype   
---  ------                            --------------  -----   
 0   gbifID                            14207 non-null  int64   
 1   datasetKey                        14207 non-null  object  
 2   occurrenceID                      14079 non-null  object  
 3   kingdom                           14207 non-null  object  
 4   phylum                            14207 non-null  object  
 5   class                             14207 non-null  object  
 6   order                             14207 non-null  object  
 7   family                            14207 non-null  object  
 8   genus                             14207 non-null  object  
 9   species                           14207 non-null  object  
 10  infraspecificEpithet              901 non-null    object  
 11  taxonRank                         14207 non-null  object  
 12  scientificName                    14207 non-null  object  
 13  verbatimScientificName            14207 non-null  object  
 14  verbatimScientificNameAuthorship  13399 non-null  object  
 15  countryCode                       14086 non-null  object  
 16  locality                          13523 non-null  object  
 17  stateProvince                     13646 non-null  object  
 18  occurrenceStatus                  14207 non-null  object  
 19  individualCount                   8474 non-null   float64 
 20  publishingOrgKey                  14207 non-null  object  
 21  decimalLatitude                   11271 non-null  float64 
 22  decimalLongitude                  11271 non-null  float64 
 23  coordinateUncertaintyInMeters     1398 non-null   float64 
 24  coordinatePrecision               0 non-null      float64 
 25  elevation                         8933 non-null   float64 
 26  elevationAccuracy                 6251 non-null   float64 
 27  depth                             908 non-null    float64 
 28  depthAccuracy                     908 non-null    float64 
 29  eventDate                         13832 non-null  object  
 30  day                               12525 non-null  float64 
 31  month                             13175 non-null  float64 
 32  year                              13681 non-null  float64 
 33  taxonKey                          14207 non-null  int64   
 34  speciesKey                        14207 non-null  int64   
 35  basisOfRecord                     14207 non-null  object  
 36  institutionCode                   14022 non-null  object  
 37  collectionCode                    5357 non-null   object  
 38  catalogNumber                     4619 non-null   object  
 39  recordNumber                      6543 non-null   object  
 40  identifiedBy                      4747 non-null   object  
 41  dateIdentified                    2360 non-null   object  
 42  license                           14207 non-null  object  
 43  rightsHolder                      3831 non-null   object  
 44  recordedBy                        11048 non-null  object  
 45  typeStatus                        1892 non-null   object  
 46  establishmentMeans                94 non-null     object  
 47  lastInterpreted                   14207 non-null  object  
 48  mediaType                         822 non-null    object  
 49  issue                             4963 non-null   object  
 50  geometry                          14207 non-null  geometry
dtypes: float64(12), geometry(1), int64(3), object(35)
memory usage: 5.5+ MB
In [ ]:
# Crear un GeoDataFrame a partir del DataFrame
ojoche= gpd.GeoDataFrame(
    ojoche,
    geometry=gpd.points_from_xy(ojoche.decimalLongitude, ojoche.decimalLatitude),
    crs='EPSG:4326'
)

# Mostrar los primeros registros del GeoDataFrame,
# incluyendo la columna de geometría
ojoche[['gbifID', 'species', 'decimalLongitude', 'decimalLatitude', 'countryCode', 'locality']].head()
Out[ ]:
gbifID species decimalLongitude decimalLatitude countryCode locality
0 931000349 Brosimum alicastrum -74.911667 5.503333 CO Vereda Sasaima. predios de ISAGEN. cerca de la...
1 930996512 Brosimum alicastrum -72.777000 8.283120 CO Km 49
2 930994646 Brosimum alicastrum -76.115710 4.878020 CO Corregimiento Morelia
3 930994477 Brosimum alicastrum -75.578083 3.810389 CO Vereda Agua Bonita
4 930992926 Brosimum alicastrum -76.662140 3.762820 CO Corregimiento Loboguerrero

Distributions

No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Categorical distributions

No description has been provided for this image

2-d distributions

No description has been provided for this image
No description has been provided for this image

Values

No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Faceted distributions

<string>:5: FutureWarning:



Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `y` variable to `hue` and set `legend=False` for the same effect.


No description has been provided for this image
<string>:5: FutureWarning:



Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `y` variable to `hue` and set `legend=False` for the same effect.


No description has been provided for this image
<string>:5: FutureWarning:



Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `y` variable to `hue` and set `legend=False` for the same effect.


No description has been provided for this image
In [ ]:
from matplotlib import pyplot as plt
_df_64['decimalLatitude'].plot(kind='line', figsize=(8, 4), title='decimalLatitude')
plt.gca().spines[['top', 'right']].set_visible(False)
No description has been provided for this image
In [ ]:
from matplotlib import pyplot as plt
import seaborn as sns
_df_59.groupby('locality').size().plot(kind='barh', color=sns.palettes.mpl_palette('Dark2'))
plt.gca().spines[['top', 'right',]].set_visible(False)
No description has been provided for this image
In [ ]:
from matplotlib import pyplot as plt
_df_26['gbifID'].plot(kind='line', figsize=(8, 4), title='gbifID')
plt.gca().spines[['top', 'right']].set_visible(False)
No description has been provided for this image
In [ ]:
# Carga del módulo pyplot de matplotlib con el alias plt
import matplotlib.pyplot as plt

Se crea un mapa estático simple para visualizar la distribución geográfica del árbol de ojoche (Brosimum alicastrum), también llamado "Ramón" o "ramón maya". Utiliza los datos almacenados en una variable llamada ojoche.¶

In [ ]:
# Mapa estático de registros de ojoche
ojoche.plot()
Out[ ]:
<Axes: >
No description has been provided for this image
In [ ]:
!pip install cartopy
import cartopy
Requirement already satisfied: cartopy in /usr/local/lib/python3.11/dist-packages (0.24.1)
Requirement already satisfied: numpy>=1.23 in /usr/local/lib/python3.11/dist-packages (from cartopy) (1.26.4)
Requirement already satisfied: matplotlib>=3.6 in /usr/local/lib/python3.11/dist-packages (from cartopy) (3.10.0)
Requirement already satisfied: shapely>=1.8 in /usr/local/lib/python3.11/dist-packages (from cartopy) (2.0.7)
Requirement already satisfied: packaging>=21 in /usr/local/lib/python3.11/dist-packages (from cartopy) (24.2)
Requirement already satisfied: pyshp>=2.3 in /usr/local/lib/python3.11/dist-packages (from cartopy) (2.3.1)
Requirement already satisfied: pyproj>=3.3.1 in /usr/local/lib/python3.11/dist-packages (from cartopy) (3.7.1)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.6->cartopy) (1.3.1)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.6->cartopy) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.6->cartopy) (4.56.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.6->cartopy) (1.4.8)
Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.6->cartopy) (11.1.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.6->cartopy) (3.2.1)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.6->cartopy) (2.8.2)
Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from pyproj>=3.3.1->cartopy) (2025.1.31)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.7->matplotlib>=3.6->cartopy) (1.17.0)
In [ ]:
# Mapa de coropletas
new_var = ojoche.plot(
    column='countryCode',
    cmap='YlOrRd', # https://matplotlib.org/stable/gallery/color/colormap_reference.html
    legend=True,
    legend_kwds={
        'label': "Población estimada",
        'orientation': "horizontal"
    },
    figsize=(12, 8)
)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-169-df1eaeaaf000> in <cell line: 0>()
      1 # Mapa de coropletas
----> 2 new_var = ojoche.plot(
      3     column='countryCode',
      4     cmap='YlOrRd', # https://matplotlib.org/stable/gallery/color/colormap_reference.html
      5     legend=True,

/usr/local/lib/python3.11/dist-packages/geopandas/plotting.py in __call__(self, *args, **kwargs)
    966         kind = kwargs.pop("kind", "geo")
    967         if kind == "geo":
--> 968             return plot_dataframe(data, *args, **kwargs)
    969         if kind in self._pandas_kinds:
    970             # Access pandas plots

/usr/local/lib/python3.11/dist-packages/geopandas/plotting.py in plot_dataframe(df, column, cmap, color, ax, cax, categorical, legend, scheme, k, vmin, vmax, markersize, figsize, legend_kwds, categories, classification_kwds, missing_kwds, aspect, autolim, **style_kwds)
    944             legend_kwds.setdefault("handles", patches)
    945             legend_kwds.setdefault("labels", categories)
--> 946             ax.legend(**legend_kwds)
    947         else:
    948             if cax is not None:

/usr/local/lib/python3.11/dist-packages/matplotlib/axes/_axes.py in legend(self, *args, **kwargs)
    335         """
    336         handles, labels, kwargs = mlegend._parse_legend_args([self], *args, **kwargs)
--> 337         self.legend_ = mlegend.Legend(self, handles, labels, **kwargs)
    338         self.legend_._remove_method = self._remove_legend
    339         return self.legend_

TypeError: Legend.__init__() got an unexpected keyword argument 'label'
No description has been provided for this image
In [ ]:
# Carga de plotly.express con el alias px
import plotly.express as px

# Carga de pandas
import pandas as pd
In [ ]:
# Carga de pandas
import pandas as pd
In [ ]:
# Borrado de filas que no tengan año
df_anio_no_nulo = ojoche.dropna(subset=['year'])

# Filtrado de los años entre 2005 y 2025
df_filtrado = df_anio_no_nulo[(df_anio_no_nulo['year'] >= 2005) & (df_anio_no_nulo['year'] <= 2015)]

# Conteo de registros por año
registros_por_anio = df_filtrado.groupby('year')['gbifID'].count().reset_index()

# Creación del gráfico de barras
fig = px.bar(
    registros_por_anio,
    x='year',
    y='gbifID',
    title='Cantidad de registros (años 2005 - 2015)'
)

# Personalización
fig.update_layout(
    xaxis_title='Año',
    yaxis_title='Cantidad de registros',
    width=1000,    # Ancho de la figura
    height=600     # Alto de la figura
)

(Brosimum alicastrum) Imagen de adaptación

In [ ]:
# Borrado de filas que no tengan año
df_anio_no_nulo = ojoche.dropna(subset=['year'])

# Filtrado de los años entre 2015 y 2025
df_filtrado = df_anio_no_nulo[(df_anio_no_nulo['year'] >= 2015) & (df_anio_no_nulo['year'] <= 2025)]

# Conteo de registros por año
registros_por_anio = df_filtrado.groupby('year')['locality'].count().reset_index()

# Creación del gráfico de barras
fig = px.bar(
    registros_por_anio,
    x='year',
    y='locality',
    title='Cantidad de registros (años 20020 - 2025)'
)

# Personalización
fig.update_layout(
    xaxis_title='Año',
    yaxis_title='Cantidad de registros',
    width=800,    # Ancho de la figura
    height=600     # Alto de la figura
)
In [ ]:
# Instalación de rasterio
!pip install rasterio --quiet
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.2/22.2 MB 71.2 MB/s eta 0:00:00
In [ ]:
# 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 [ ]:
import rasterio
import rasterio.plot
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt

El ojoche se extiende en medio del tropico, principalmente por todo centroamérica, en bosques, bajo temperaturas más altas.¶

In [ ]:
# Mapa de temperatura media anual
rasterio.plot.show(temperatura_media_anual)
/usr/local/lib/python3.11/dist-packages/matplotlib/colors.py:777: RuntimeWarning:

overflow encountered in multiply

No description has been provided for this image
Out[ ]:
<Axes: >

Referencias bibliográficas¶

Roque, A. Orantes, C. 2012. Aprovechamiento del árbol nativo Brosimum alicastrum Swartz (Moraceae) en la Selva Zoque Chiapas, México. https://repositorio.unicach.mx/handle/20.500.12753/1723¶

Ramírez, S. 2017. EL RAMÓN (Brosimum alicastrum Swartz) UNA ALTERNATIVA PARA LA SEGURIDAD ALIMENTARIA EN MÉXICO. Vol. 10 Núm. 1 (2017): ENERO.https://www.revista-agroproductividad.org/index.php/agroproductividad/article/view/943¶