Acianthera (Orchidaceae) en Ámerica: distribución y descripción de hábitat.¶

Introducción¶

El género Acianthera tiene 302 especies registradas, que van desde México hasta Argentina y las Antillas (POWO 2025). Este género de orquídeas se encuentra en bosques húmedos desde los 700m hasta los 2000m snm. Generalmente son epifitas y ocasionalmente pueden ser encontradas prosperando en el suelo sobre camas de musgo. La mayoría de las especies tiene una inflorescencia con flores equitantes que salen de la base de la hoja y en unas cuantas la inflorescencia parece salir a partir de la mitad de la hoja (ver Figura 1; Sayers & du Plooy 2003, Luer 2004, Solano Gómez 2015, Karremans et al. 2016; Solano & Karremans 2023).

Figura 1. Detalle de floraciones de Acianthera spp. A. Acianthera circumplexa, con inflorescencia sobre la hoja. Guatemala; B. Acianthera pollardiana con inflorescencia en la base de la hoja. México. Créditos fotográficos: A. M.L.Maldonado B. G.A.Salazar.¶

In [ ]:
# @title .
# probando hacer las fotos más pequeñas.
from IPython.display import Image
# url de varias Aciantheras
image_url = 'https://live.staticflickr.com/65535/54389025214_084db99c83_q.jpg'
display(Image(url=image_url, width=200, height=150))


image_url = 'https://scontent.fgua9-1.fna.fbcdn.net/v/t39.30808-6/462845607_2987620708054117_6484602764357257968_n.jpg?_nc_cat=107&ccb=1-7&_nc_sid=127cfc&_nc_ohc=_ySsPdz2eyQQ7kNvgE6Etz4&_nc_oc=AdgwRHseirhjprsp7MSVytm4voRhR-Ems_j1DDoFaADroJ_CkzNerrvZwwfG4F7l1xk&_nc_zt=23&_nc_ht=scontent.fgua9-1.fna&_nc_gid=nFpoggNzelNPUlkUmXcdBg&oh=00_AYHFzkxThZEJlaHGR3LfdYggg0UG5J40bh3WVFbGcMB72Q&oe=67DBB81F'
display(Image(url=image_url, width=200, height=150))
No description has been provided for this image
No description has been provided for this image

Metodología¶

Se hicieron las búsquedas de documentos históricos depositados en la biblioteca virtual "Biodiversity Heritage Library" (BHL, 2025) y scholar Google. Para los registros se realizó una búsqueda en la base de datos de GBif (2025) y para confirmar el tratamiento actual de los nombres científicos se utilizó POWO (2025). En base a esto se limpió la hoja de datos de GBif, se descartaron los datos georreferenciados como 0,0 y los datos que aparecían fuera de los perímetros de los paises reportados fueron corregidos en base a sus repectivos datos verbatim de colecta. Se crearon mapas interactivos para localización de individuos y número de especies de Acianthera por país. Se localizaron los registros sobre el mapa de temperatura media anual, precipitación pluvial anual y sobre los posibles bosques nubosos (Wilson & Jetz 2016; Helmer et al. 2019).

In [ ]:
# @title Instalación de pygbif
!pip install pygbif --quiet

from pygbif import occurrences
import pandas as pd # biblioteca para análisis de datos

##### Nombre científico del género a buscar
género = "Acianthera"

limite = 6000   ##### Límite de registros por solicitud
offset = 0    ##### Desplazamiento para iniciar la solicitud
registros_acumulados = []  ##### Lista para acumular los resultados

##### Ciclo que obtiene los registros en la cantidad especificada
##### en la variable limite
while True:
    ##### Solicitud
    res = occurrences.search(
        scientificName=género,
        hasCoordinate=True,
        hasGeospatialIssue=False,
        limit=limite,
        offset=offset
    )

    ##### Extraer resultados
    registros = res.get("results", [])

    ##### Si ya no hay resultados, se detiene el ciclo
    if not registros:
        break

    ##### Agregar registros nuevos al acumulado
    registros_acumulados.extend(registros)

    ##### Actualizar el offset para la siguiente "página"
    offset += limite

##### Convertir todo a un DataFrame de pandas
Acianthera_presencia = pd.DataFrame(registros_acumulados)

##### Cantidad de registros de presencia recuperados
print(f"Se recuperaron {len(Acianthera_presencia)} registros de presencia")

##### Muestra de los registros recuperados
Acianthera_presencia[['species', 'basisOfRecord', 'countryCode', 'locality', 'decimalLongitude', 'decimalLatitude', 'eventDate', 'year', 'month', 'datasetKey', 'recordedBy']].sample(10)
Se recuperaron 300 registros de presencia
Out[ ]:
species basisOfRecord countryCode locality decimalLongitude decimalLatitude eventDate year month datasetKey recordedBy
218 Acianthera panduripetala PRESERVED_SPECIMEN BR NaN -48.694722 -26.730278 2023-07-26 2023 7 b9a43c60-d2b6-445c-9362-2db65465c963 A. Kassner-Filho
32 Acianthera polystachya HUMAN_OBSERVATION CO NaN -75.788467 5.624463 2024-03-16T12:51:27 2024 3 50c9509d-22c7-4a22-a47d-8c48425ef4a7 Dominique Hämmerli
107 Acianthera saurocephala HUMAN_OBSERVATION BR NaN -42.835253 -22.376547 2024-10-14T15:06 2024 10 50c9509d-22c7-4a22-a47d-8c48425ef4a7 Victor Farjalla Pontes
92 Acianthera hygrophila HUMAN_OBSERVATION BR NaN -48.802930 -26.928494 2024-08-05T19:19:12 2024 8 50c9509d-22c7-4a22-a47d-8c48425ef4a7 Pedro Behne
61 Acianthera sonderiana PRESERVED_SPECIMEN BR Trilha do Morro Pão de Loth. Parque Estadual d... -49.010278 -25.405000 2024-04-11 2024 4 a51fa32f-831d-49d6-8b8a-c7b52ae65b3b Foerster Y.
266 Acianthera prolifera PRESERVED_SPECIMEN BR Reserva Biológica de Araras -43.285278 -22.477500 2023-12-14 2023 12 cd6905cf-54d7-4628-b762-f63d269e239b Silva, T.F.; Baumgratz, J.F.A.; Mattos, J.R. &...
12 NaN PRESERVED_SPECIMEN BR Rodovia Ilhéus/Itabuna, Km 28, Centro de Pesqu... -39.236389 -14.765278 2024-01-30 2024 1 bc81e05b-ed51-46ba-a0a4-90fbae9b5545 Lins, B.A.
293 Acianthera sonderiana HUMAN_OBSERVATION BR NaN -51.528333 -27.045000 2022-03-29T14:19:12 2022 3 50c9509d-22c7-4a22-a47d-8c48425ef4a7 Camilla Botelho
147 Acianthera sonderiana HUMAN_OBSERVATION BR NaN -49.359506 -26.273464 2023-03-23T13:30 2023 3 50c9509d-22c7-4a22-a47d-8c48425ef4a7 fmunoz
164 Acianthera sonderiana HUMAN_OBSERVATION BR NaN -51.450458 -25.444155 2023-04-19T10:11:24 2023 4 50c9509d-22c7-4a22-a47d-8c48425ef4a7 Adriano Silvério
In [ ]:
# @title Cargar bibliotecas necesarias
!pip install pandas==2.2.2 geopandas==0.14.0 fiona==1.9.6 mapclassify # Install mapclassify
import geopandas as gpd
import pandas as pd
import folium
import matplotlib.pyplot as plt
import mapclassify #### Import mapclassify
Requirement already satisfied: pandas==2.2.2 in /usr/local/lib/python3.11/dist-packages (2.2.2)
Requirement already satisfied: geopandas==0.14.0 in /usr/local/lib/python3.11/dist-packages (0.14.0)
Requirement already satisfied: fiona==1.9.6 in /usr/local/lib/python3.11/dist-packages (1.9.6)
Requirement already satisfied: mapclassify in /usr/local/lib/python3.11/dist-packages (2.4.3)
Requirement already satisfied: numpy>=1.23.2 in /usr/local/lib/python3.11/dist-packages (from pandas==2.2.2) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas==2.2.2) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas==2.2.2) (2025.1)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas==2.2.2) (2025.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from geopandas==0.14.0) (24.2)
Requirement already satisfied: pyproj>=3.3.0 in /usr/local/lib/python3.11/dist-packages (from geopandas==0.14.0) (3.7.1)
Requirement already satisfied: shapely>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from geopandas==0.14.0) (2.0.7)
Requirement already satisfied: attrs>=19.2.0 in /usr/local/lib/python3.11/dist-packages (from fiona==1.9.6) (25.2.0)
Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from fiona==1.9.6) (2025.1.31)
Requirement already satisfied: click~=8.0 in /usr/local/lib/python3.11/dist-packages (from fiona==1.9.6) (8.1.8)
Requirement already satisfied: click-plugins>=1.0 in /usr/local/lib/python3.11/dist-packages (from fiona==1.9.6) (1.1.1)
Requirement already satisfied: cligj>=0.5 in /usr/local/lib/python3.11/dist-packages (from fiona==1.9.6) (0.7.2)
Requirement already satisfied: six in /usr/local/lib/python3.11/dist-packages (from fiona==1.9.6) (1.17.0)
Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.11/dist-packages (from mapclassify) (1.14.1)
Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (from mapclassify) (1.6.1)
Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from mapclassify) (3.4.2)
Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify) (3.5.0)
In [ ]:
# @title DataFrame con registros de presencia de Acianthera
Acianthera_df = pd.read_csv(
'https://raw.githubusercontent.com/mayramaldonadom/CursoPhyton2025/main/occurrenceaACIANTHERA_c.csv', sep=';')

Acianthera_df.head()
Out[ ]:
gbifID Especie_POWO032025 Latitude Longitude continent countryC
0 45815831 Acianthera 10.13 -84.55 NORTH_AMERICA CR
1 45816035 Acianthera circumplexa 9.86 -84.36 NORTH_AMERICA CR
2 45816155 Acianthera sicaria 9.83 -84.01 NORTH_AMERICA CR
3 45816164 Acianthera sicaria 10.36 -84.36 NORTH_AMERICA CR
4 45816202 Acianthera lojae 9.77 -83.98 NORTH_AMERICA CR

Resultados¶

Hay al menos 1,363 registros identificadas hasta género de los 14,743 registros en GBif (marzo 2025). Estos registros incluyen individuos silvestres de las Américas y en cultivo en Europa y África (Fig. 2).

In [ ]:
# @title Figura 2. Registros de _Acianthera_ por continente (GBif 2025).

from matplotlib import pyplot as plt
import seaborn as sns
Acianthera_df.groupby('continent').size().plot(kind='barh', color=sns.palettes.mpl_palette('Dark2'))
plt.gca().spines[['top', 'right',]].set_visible(False)
plt.title('Registros por continente')
plt.show()
No description has been provided for this image
In [ ]:
# @title Figura 3. Número de registros de _Acianthera_ por pais (GBif 2025).

from matplotlib import pyplot as plt
import seaborn as sns
Acianthera_df.groupby('countryC').size().plot(kind='barh', color=sns.palettes.mpl_palette('Dark2'))
plt.gca().spines[['top', 'right',]].set_visible(False)
plt.title('Registros por pais')
plt.show()
No description has been provided for this image
In [ ]:
# @title Figura 4. Países con más registros de _Acianthera_ spp. (GBif 2025).
from IPython.display import Image
# url de varias Aciantheras
image_url = 'https://github.com/mayramaldonadom/CursoPhyton2025/raw/main/Paises%20con%20mas%20registros%20de%20aciantheras.jpg'
display(Image(url=image_url))
No description has been provided for this image
In [ ]:
# @title Figura 5. Especies más comunes de _Acianthera_ spp. en registros publicados en GBif (2025).
from IPython.display import Image
# url de varias Aciantheras
image_url = 'https://github.com/mayramaldonadom/CursoPhyton2025/raw/main/Acianteras%20mas%20comunes.jpg'
display(Image(url=image_url))
No description has been provided for this image

Mapeo¶

In [ ]:
# @title Crear GeoDataFrame de Acianthera
Acianthera_gdf = gpd.GeoDataFrame(
    Acianthera_df,
    geometry=gpd.points_from_xy(Acianthera_df['Longitude'], Acianthera_df['Latitude']),
       crs="EPSG:4326"
)
In [ ]:
# @title Mapa estático de registros de _Acianthera_ spp.
Acianthera_gdf.plot()
Out[ ]:
<Axes: >
No description has been provided for this image
In [ ]:
# @title 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.00000 -16.06713, 180.00000...
1 TZA Tanzania 58005463.0 63177 MULTIPOLYGON (((33.90371 -0.95000, 34.07262 -1...
2 B28 W. Sahara 603253.0 907 MULTIPOLYGON (((-8.66559 27.65643, -8.66512 27...
3 CAN Canada 37589262.0 1736425 MULTIPOLYGON (((-122.84000 49.00000, -122.9742...
4 USA United States of America 328239523.0 21433226 MULTIPOLYGON (((-122.84000 49.00000, -120.0000...
In [ ]:
# @title Mapa estático de países
paises_gdf.plot()
Out[ ]:
<Axes: >
No description has been provided for this image
In [ ]:
# @title Mapa de coropletas
paises_gdf.plot(
    column='POP_EST',
    cmap='YlOrRd', # https://matplotlib.org/stable/gallery/color/colormap_reference.html
    legend=True,
    legend_kwds={
        'label': "Población estimada",
        'orientation': "horizontal"
    },
    figsize=(12, 8)
)
Out[ ]:
<Axes: >
No description has been provided for this image
In [ ]:
# @title Mapa estático de _Acianthera_ spp. en América.
fig, ax = plt.subplots(figsize=(8, 8))

# Capa de países de América
paises_gdf[(paises_gdf['CONTINENT'] == 'South America') | (paises_gdf['CONTINENT'] == 'North America')].plot(
    ax=ax,
    color="white",
    edgecolor="black"
)

# Capa de registros de _Acianthera en el hemisferio occidental
Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)].plot(
    ax=ax,
    marker="o",
    color="red",
    markersize=5
)
Out[ ]:
<Axes: >
No description has been provided for this image
In [ ]:
# @title Mapa interactivo de registros de _Acianthera_ spp.
Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)].explore()
Out[ ]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [ ]:
# @title Capa de países
m = paises_gdf[(paises_gdf['CONTINENT'] == 'South America') | (paises_gdf['CONTINENT'] == 'North America')].explore(
    name='Países',
    tooltip=['NAME'],
    popup=True,
    style_kwds={
        'fillColor': 'lightgray',
        'color': 'black',
        'weight': 1,
        'fillOpacity': 0.5
    }
)

# Capa de Acianthera
# Replace 'species' with 'Especie_POWO032025' in the tooltip argument
Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)].explore(
    m=m, # se usa el mapa que se creó en la instrucción anterior
    name='Acianthera',
    marker_type='circle',
    marker_kwds={'radius': 20, 'color': 'red'},
    tooltip=['Especie_POWO032025', 'countryC'],
    popup=True
)

# Agregar un control de capas al mapa
folium.LayerControl().add_to(m)

# Mostrar el mapa interactivo
m
Out[ ]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [ ]:
# @title Filtrar datos para determinar riqueza de especies de _Acianthera_ spp.
## Filtrar los datos
Acianthera_america_gdf = Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)]
paises_america_gdf = paises_gdf[(paises_gdf['CONTINENT'] == 'South America') | (paises_gdf['CONTINENT'] == 'North America')]

## Definir un índice
paises_america_gdf.set_index('ADM0_ISO', inplace=True)
In [ ]:
# @title Unión de datos de especies de _Acianthera_ spp. y datos de país.
## Filtrar los datos
Acianthera_america_gdf = Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)]
paises_america_gdf = paises_gdf[(paises_gdf['CONTINENT'] == 'South America') | (paises_gdf['CONTINENT'] == 'North America')]

## Unión (join) espacial
Acianthera_paises_america_gdf = Acianthera_america_gdf.sjoin(
    paises_america_gdf,
    predicate='intersects'
)

Acianthera_paises_america_gdf[['gbifID','Especie_POWO032025','ADM0_ISO','NAME','POP_EST']].head()
Out[ ]:
gbifID Especie_POWO032025 ADM0_ISO NAME POP_EST
0 45815831 Acianthera CRI Costa Rica 5047561.0
1 45816035 Acianthera circumplexa CRI Costa Rica 5047561.0
2 45816155 Acianthera sicaria CRI Costa Rica 5047561.0
3 45816164 Acianthera sicaria CRI Costa Rica 5047561.0
4 45816202 Acianthera lojae CRI Costa Rica 5047561.0
In [ ]:
# @title Conteo de especies en cada país
conteo_especies_por_pais = Acianthera_paises_america_gdf.groupby("ADM0_ISO")['Especie_POWO032025'].nunique()

## Convertir la serie a dataframe
conteo_especies_por_pais = conteo_especies_por_pais.reset_index()

## Definir un índice
conteo_especies_por_pais.set_index('ADM0_ISO', inplace=True)

## Cambio de nombre de columna
conteo_especies_por_pais.rename(columns = {'Especie_POWO032025': 'especies_Acianthera'}, inplace = True)

## Despliegue de países y cantidades de especies
conteo_especies_por_pais.sort_values(by="especies_Acianthera", ascending=False)
Out[ ]:
especies_Acianthera
ADM0_ISO
BRA 94
ECU 43
COL 33
PER 22
MEX 22
BOL 19
ARG 18
CRI 18
VEN 17
PAN 12
GTM 10
HND 10
CUB 10
DOM 9
NIC 9
JAM 6
PRY 6
GUY 4
PRI 4
BLZ 3
SLV 3
SUR 3
HTI 3
TTO 2
URY 2
In [ ]:
# @title Conteo de _Acianthera_ spp. en cada país de América. Este comando me da problemas, debo correr cada paso anterior para que cuente como debe, y cada vez es distinto mapa el problemático.
paises_america_riqueza_Acianthera_gdf = paises_america_gdf.join(conteo_especies_por_pais)

paises_america_riqueza_Acianthera_gdf[['especies_Acianthera']].sort_values(by='especies_Acianthera', ascending=False)
Out[ ]:
especies_Acianthera
3 NaN
4 NaN
9 NaN
10 NaN
16 NaN
17 NaN
19 NaN
20 NaN
22 NaN
27 NaN
28 NaN
29 NaN
30 NaN
31 NaN
32 NaN
33 NaN
34 NaN
35 NaN
36 NaN
37 NaN
38 NaN
39 NaN
40 NaN
41 NaN
42 NaN
44 NaN
45 NaN
46 NaN
47 NaN
156 NaN
175 NaN
In [ ]:
# @title Mapa estático de Riqueza de especies de _Acianthera_ spp.
paises_america_riqueza_Acianthera_gdf.plot(
    column="especies_Acianthera",
    legend=True,
    cmap='OrRd',
    scheme='quantiles',
    figsize=(12, 12)
)
/usr/local/lib/python3.11/dist-packages/mapclassify/classifiers.py:238: UserWarning: Warning: Not enough unique values in array to form k classes
  Warn(
/usr/local/lib/python3.11/dist-packages/mapclassify/classifiers.py:241: UserWarning: Warning: setting k to 1
  Warn("Warning: setting k to %d" % k_q, UserWarning)
/usr/local/lib/python3.11/dist-packages/numpy/core/fromnumeric.py:3504: RuntimeWarning: Mean of empty slice.
  return _methods._mean(a, axis=axis, dtype=dtype,
/usr/local/lib/python3.11/dist-packages/numpy/core/_methods.py:129: RuntimeWarning: invalid value encountered in scalar divide
  ret = ret.dtype.type(ret / rcount)
/usr/local/lib/python3.11/dist-packages/mapclassify/classifiers.py:891: RuntimeWarning: invalid value encountered in scalar divide
  gadf = 1 - self.adcm / adam
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-21-e2955fd51a28> in <cell line: 0>()
      1 # @title Mapa estático de Riqueza de especies de _Acianthera_ spp.
----> 2 paises_america_riqueza_Acianthera_gdf.plot(
      3     column="especies_Acianthera",
      4     legend=True,
      5     cmap='OrRd',

/usr/local/lib/python3.11/dist-packages/geopandas/plotting.py in __call__(self, *args, **kwargs)
    977         kind = kwargs.pop("kind", "geo")
    978         if kind == "geo":
--> 979             return plot_dataframe(data, *args, **kwargs)
    980         if kind in self._pandas_kinds:
    981             # 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, **style_kwds)
    795                 fmt = legend_kwds.pop("fmt")
    796 
--> 797             labels = binning.get_legend_classes(fmt)
    798             if legend_kwds is not None:
    799                 show_interval = legend_kwds.pop("interval", False)

/usr/local/lib/python3.11/dist-packages/mapclassify/classifiers.py in get_legend_classes(self, fmt)
    976                k strings with class interval definitions
    977         """
--> 978         return _get_mpl_labels(self, fmt)
    979 
    980     def plot(

/usr/local/lib/python3.11/dist-packages/mapclassify/classifiers.py in _get_mpl_labels(mc, fmt)
    127              k strings for class intervals
    128     """
--> 129     edges, max_width, lower_open = _format_intervals(mc, fmt)
    130     k = len(edges) - 1
    131     left = ["["]

/usr/local/lib/python3.11/dist-packages/mapclassify/classifiers.py in _format_intervals(mc, fmt)
     95 
     96 
---> 97     lowest = mc.y.min()
     98     if hasattr(mc, 'lowest'):
     99         if mc.lowest is not None:

/usr/local/lib/python3.11/dist-packages/numpy/core/_methods.py in _amin(a, axis, out, keepdims, initial, where)
     43 def _amin(a, axis=None, out=None, keepdims=False,
     44           initial=_NoValue, where=True):
---> 45     return umr_minimum(a, axis, None, out, keepdims, initial, where)
     46 
     47 def _sum(a, axis=None, dtype=None, out=None, keepdims=False,

ValueError: zero-size array to reduction operation minimum which has no identity
No description has been provided for this image

Figura 6. Mapa interactivo de Acianthera spp.: riqueza de especies y registros en América.¶

In [ ]:
# @title Mapa interactivo
m = paises_america_riqueza_Acianthera_gdf.explore(
    column='especies_Acianthera',
    name='Riqueza de especies de Acianthera y localidades de colecta',
    cmap='OrRd',
    tooltip=['ADM0_ISO', 'NAME', 'especies_Acianthera'],
    legend=True,
    legend_kwds={
        'caption': "Riqueza de especies de Acianthera",
        'orientation': "horizontal"
    },
    bounds=[[-180, 0], [0, 0]]
)

# Añadir los registros de Acianthera al mapa
Acianthera_america_gdf.explore(
    m=m, # se usa el mapa que se creó en la instrucción anterior
    name='Registros de presencia de Acianthera',
    marker_type='circle',
    marker_kwds={'radius': 20, 'color': 'black'},
    tooltip=['Especie_POWO032025'],
    popup=True
)

# Agregar un control de capas al mapa
folium.LayerControl().add_to(m)

# Mostrar el mapa interactivo
m
Out[ ]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Mapas raster¶

In [ ]:
# @title Instalación de rasterio
!pip install rasterio --quiet
In [ ]:
# @title 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

Temperatura media anual (Fick & Hijmans 2020).¶

In [ ]:
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'>
In [ ]:
# Nombre de la fuente de datos
temperatura_media_anual.name
Out[ ]:
'https://github.com/datos-geoespaciales-biodiversidad/python/raw/refs/heads/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_1.tif'
In [ ]:
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
temperatura_media_anual.mode
Out[ ]:
'r'
In [ ]:
# CRS
temperatura_media_anual.crs
Out[ ]:
CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]')
In [ ]:
# Resolución (tamaño de cada celda)
temperatura_media_anual.res
Out[ ]:
(0.16666666666666666, 0.16666666666666666)
In [ ]:
# Límites
temperatura_media_anual.bounds
Out[ ]:
BoundingBox(left=-180.0, bottom=-90.0, right=180.0, top=90.0)
In [ ]:
# Metadatos de capa de temperatura media anual
temperatura_media_anual.meta
Out[ ]:
{'driver': 'GTiff',
 'dtype': 'float32',
 'nodata': -3.3999999521443642e+38,
 'width': 2160,
 'height': 1080,
 'count': 1,
 'crs': CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]'),
 'transform': Affine(0.16666666666666666, 0.0, -180.0,
        0.0, -0.16666666666666666, 90.0)}
In [ ]:
# @title Mapa de temperatura media anual
rasterio.plot.show(temperatura_media_anual)
No description has been provided for this image
Out[ ]:
<Axes: >
In [ ]:
# @title Visualización de temperatura media anual en América.
fig, ax = plt.subplots(figsize=(8, 8))

# Mapa de temperatura media anual
rasterio.plot.show(
    temperatura_media_anual,
    cmap="viridis", # colores
    ax=ax,
    title="Temperatura media anual"
)

# Agregar una leyenda
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.8)
cbar.set_label('°C')

# Limitar el rango de los ejes
ax.set_xlim(-170.0, -30.0)
ax.set_ylim(-90.0, 90.0)

plt.show()
No description has been provided for this image
In [ ]:
# se me está trabando y dice que es por problemas de que no tengo suficiente RAM, voy por partes

import rasterio
import rasterio.plot
import geopandas as gpd
import matplotlib.pyplot as plt
!pip install mapclassify==2.4.3
import mapclassify
import folium
Requirement already satisfied: mapclassify==2.4.3 in /usr/local/lib/python3.11/dist-packages (2.4.3)
Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.14.1)
Requirement already satisfied: numpy>=1.3 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.26.4)
Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.6.1)
Requirement already satisfied: pandas>=1.0 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (2.2.2)
Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (3.4.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2025.1)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2025.1)
Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify==2.4.3) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify==2.4.3) (3.5.0)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas>=1.0->mapclassify==2.4.3) (1.17.0)

Figura 7. Temperatura media anual y localidades de colecta de Acianthera spp. en América¶

In [ ]:
# @title temperatura media anual en ºC para América
fig, ax = plt.subplots(figsize=(10, 10))

# Graficar la capa raster
rasterio.plot.show(temperatura_media_anual, ax=ax, cmap='viridis', title='Temperatura media anual y localidades de Acianthera spp.')

# Agregar una leyenda
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.5)
cbar.set_label('°C')

# Capa de registros de _Acianthera_ en el hemisferio occidental
ax.set_xlim(-130.0, -30.0)
ax.set_ylim(-50.0, 30.0)


# Filter the GeoDataFrame before calling .plot
Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)].plot(
    ax=ax,
    marker="o",
    color="gray",
    markersize=5
)

plt.show()
/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

Precipitación pluvial anual (Fick & Hijmans 2020).¶

Precipitación pluvial anual (Fick & Hijmans 2020)¶

In [ ]:
import rasterio
import rasterio.plot
import geopandas as gpd
import matplotlib.pyplot as plt
!pip install mapclassify==2.4.3
import mapclassify
import folium
Requirement already satisfied: mapclassify==2.4.3 in /usr/local/lib/python3.11/dist-packages (2.4.3)
Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.14.1)
Requirement already satisfied: numpy>=1.3 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.26.4)
Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.6.1)
Requirement already satisfied: pandas>=1.0 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (2.2.2)
Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (3.4.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2025.1)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2025.1)
Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify==2.4.3) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify==2.4.3) (3.5.0)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas>=1.0->mapclassify==2.4.3) (1.17.0)
In [ ]:
Precipitacion_pluvial_anual = rasterio.open(
    'https://github.com/datos-geoespaciales-biodiversidad/python/raw/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_12.tif'
)

print(Precipitacion_pluvial_anual)
<open DatasetReader name='https://github.com/datos-geoespaciales-biodiversidad/python/raw/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_12.tif' mode='r'>
In [ ]:
# Nombre de la fuente de datos Precipitacion pluvial anual
Precipitacion_pluvial_anual.name
Out[ ]:
'https://github.com/datos-geoespaciales-biodiversidad/python/raw/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_12.tif'
In [ ]:
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
Precipitacion_pluvial_anual.mode
Out[ ]:
'r'
In [ ]:
# CRS
Precipitacion_pluvial_anual.crs
Out[ ]:
CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]')
In [ ]:
# Resolución (tamaño de cada celda)
Precipitacion_pluvial_anual.res
Out[ ]:
(0.16666666666666666, 0.16666666666666666)
In [ ]:
# Límites
Precipitacion_pluvial_anual.bounds
Out[ ]:
BoundingBox(left=-180.0, bottom=-90.0, right=180.0, top=90.0)
In [ ]:
# Metadatos de capa de Precipitacion pluvial anual
Precipitacion_pluvial_anual.meta
Out[ ]:
{'driver': 'GTiff',
 'dtype': 'float32',
 'nodata': -3.3999999521443642e+38,
 'width': 2160,
 'height': 1080,
 'count': 1,
 'crs': CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]'),
 'transform': Affine(0.16666666666666666, 0.0, -180.0,
        0.0, -0.16666666666666666, 90.0)}
In [ ]:
# @title Mapa de precipitacion pluvial anual
rasterio.plot.show(Precipitacion_pluvial_anual)
No description has been provided for this image
Out[ ]:
<Axes: >
In [ ]:
# @title Precipitacion pluvial anual en América (Fick & Hijmas 2020).
fig, ax = plt.subplots(figsize=(8, 8))

# Mapa de Precipitacion pluvial anual
rasterio.plot.show(
    Precipitacion_pluvial_anual,
    cmap="Blues", # colores
    ax=ax,
    title="Precipitacion pluvial anual"
)

# Agregar una leyenda
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.8)
cbar.set_label('mm')

# Limitar el rango de los ejes
ax.set_xlim(-170.0, -30.0)
ax.set_ylim(-90.0, 90.0)

plt.show()
No description has been provided for this image
In [ ]:
import rasterio
import rasterio.plot
import geopandas as gpd
import matplotlib.pyplot as plt
!pip install mapclassify==2.4.3
import mapclassify
import folium
Requirement already satisfied: mapclassify==2.4.3 in /usr/local/lib/python3.11/dist-packages (2.4.3)
Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.14.1)
Requirement already satisfied: numpy>=1.3 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.26.4)
Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (1.6.1)
Requirement already satisfied: pandas>=1.0 in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (2.2.2)
Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from mapclassify==2.4.3) (3.4.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2025.1)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.0->mapclassify==2.4.3) (2025.1)
Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify==2.4.3) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->mapclassify==2.4.3) (3.5.0)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas>=1.0->mapclassify==2.4.3) (1.17.0)

Figura 8. Precipitación pluvial anual y localidades de colecta de Acianthera spp. en América¶

In [ ]:
# @title Precipitación pluvial en mm
fig, ax = plt.subplots(figsize=(10, 10))

# Graficar la capa raster
rasterio.plot.show(temperatura_media_anual, ax=ax, cmap='Blues', title='Precipitación Anual y localidades de Acianthera')

# Agregar una leyenda
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.9)
cbar.set_label('mm')

# Capa de registros de _Acianthera_ en el hemisferio occidental
ax.set_xlim(-130.0, -30.0)
ax.set_ylim(-50.0, 30.0)


# Filter the GeoDataFrame before calling .plot
Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)].plot(
    ax=ax,
    marker="o",
    color="black",
    markersize=5
)

plt.show()
/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

Figura . Precipitación pluvial (mm) y localidades de Acianthera en América¶

Asociación de Acianthera spp. a bosques nubosos.¶

Predicción de bosque nuboso (Helmer et al. 2019)¶

In [ ]:
Predicción_Bosque_Nuboso_2019 = rasterio.open(
    'https://github.com/mayramaldonadom/CursoPhyton2025/raw/main/helmeretal2019_cloudforest_paramo.tif'
)

print(Predicción_Bosque_Nuboso_2019)
<open DatasetReader name='https://github.com/mayramaldonadom/CursoPhyton2025/raw/main/helmeretal2019_cloudforest_paramo.tif' mode='r'>
In [ ]:
# Nombre de la fuente de datos Bosque Nuboso
Predicción_Bosque_Nuboso_2019.name
Out[ ]:
'https://github.com/mayramaldonadom/CursoPhyton2025/raw/main/helmeretal2019_cloudforest_paramo.tif'
In [ ]:
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
Predicción_Bosque_Nuboso_2019.mode
Out[ ]:
'r'
In [ ]:
# CRS
Predicción_Bosque_Nuboso_2019.crs
Out[ ]:
CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]')
In [ ]:
# Resolución (tamaño de cada celda)
Predicción_Bosque_Nuboso_2019.res
Out[ ]:
(0.00208333333, 0.00208333333)
In [ ]:
# Límites
Predicción_Bosque_Nuboso_2019.bounds
Out[ ]:
BoundingBox(left=-110.507967978275, bottom=-29.999823739751946, right=-33.543384768085005, top=27.06267616894806)
In [ ]:
# Metadatos de capa de predicción bosque nuboso 2019.
Predicción_Bosque_Nuboso_2019.meta
Out[ ]:
{'driver': 'GTiff',
 'dtype': 'uint8',
 'nodata': None,
 'width': 36943,
 'height': 27390,
 'count': 1,
 'crs': CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]'),
 'transform': Affine(0.00208333333, 0.0, -110.507967978275,
        0.0, -0.00208333333, 27.06267616894806)}
In [ ]:
# @title Mapa de Predicción de bosques nubosos (Helmer et al. 2019) **Aquí me truena por falta de memoria RAM.**
rasterio.plot.show(Predicción_Bosque_Nuboso_2019)
In [ ]:
# @title Predicción de bosques nubosos en América (Helmer et al. 2019).
fig, ax = plt.subplots(figsize=(8, 8))

# Mapa de predicción de bosques nubosos (Helmer et al. 2019)
rasterio.plot.show(
    Predicción_Bosque_Nuboso_2019,
    cmap="Blues", # colores
    ax=ax,
    title="Predicción de bosques nubosos montanos neotropicales y páramo"
)

# Agregar una leyenda
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.8)
cbar.set_label('bosques nubosos montanos tropicales, TMCF, y páramo')

# Limitar el rango de los ejes
ax.set_xlim(-170.0, -30.0)
ax.set_ylim(-90.0, 90.0)

plt.show()

Predicción de bosque nuboso (Wilson & Jetz 2016)¶

No me corre la visualización por falta de memoria RAM :( En teoría está bien hecho :/

In [ ]:
Predicción_Bosque_Nuboso_2016 = rasterio.open(
    'https://data.earthenv.org/cloud/MODCF_CloudForestPrediction.tif'
)

print(Predicción_Bosque_Nuboso_2016)
<open DatasetReader name='https://data.earthenv.org/cloud/MODCF_CloudForestPrediction.tif' mode='r'>
In [ ]:
# Nombre de la fuente de datos Bosque Nuboso
Predicción_Bosque_Nuboso_2016.name
Out[ ]:
'https://data.earthenv.org/cloud/MODCF_CloudForestPrediction.tif'
In [ ]:
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
Predicción_Bosque_Nuboso_2016.mode
Out[ ]:
'r'
In [ ]:
# CRS
Predicción_Bosque_Nuboso_2016.crs
Out[ ]:
CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]')
In [ ]:
# Resolución (tamaño de cada celda)
Predicción_Bosque_Nuboso_2016.res
Out[ ]:
(0.008333333333333333, 0.008333333333392604)
In [ ]:
# Límites
Predicción_Bosque_Nuboso_2016.bounds
Out[ ]:
BoundingBox(left=-160.0, bottom=-23.433333333000004, right=160.0, top=23.433333334)
In [ ]:
# Metadatos de capa de predicción de bosques nubosos
Predicción_Bosque_Nuboso_2016.meta
Out[ ]:
{'driver': 'GTiff',
 'dtype': 'float32',
 'nodata': -3.3999999521443642e+38,
 'width': 38400,
 'height': 5624,
 'count': 1,
 'crs': CRS.from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]'),
 'transform': Affine(0.008333333333333333, 0.0, -160.0,
        0.0, -0.008333333333392604, 23.433333334)}
In [ ]:
# @title Mapa de Predicción de bosques nubosos. **_ibidem_, igual tira todo.**
rasterio.plot.show(Predicción_Bosque_Nuboso_2016)
In [ ]:
# @title Predicción de bosques nubosos en América (Wilson & Jetz 2016).
fig, ax = plt.subplots(figsize=(8, 8))

# Mapa de predicción de bosques nubosos en América (Wilson & Jetz 2016).
rasterio.plot.show(
    Predicción_Bosque_Nuboso_2016,
    cmap="Blues", # colores
    ax=ax,
    title="Predicción de bosques nubosos "
)

# Agregar una leyenda
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.8)
cbar.set_label('% de frecuencia anual de nubes')

# Limitar el rango de los ejes
ax.set_xlim(-170.0, -30.0)
ax.set_ylim(-90.0, 90.0)

plt.show()

Discusión y Conclusiones¶

Bibliografía¶

Acianthera Scheidw. in GBIF Secretariat (2023). GBIF Backbone Taxonomy. Checklist dataset https://doi.org/10.15468/39omei accessed via GBIF.org on 2025-03-03.

BHL. 2025. Biodiversity Heritage Library. http://www.biodiversitylibrary.org (marzo 2025).

Damián, A.; Mitidieri, N. & G. Chiron. A taxonomic synopsis of Acianthera (Orchidaceae: Pleurothallidinae) in Peru, including two new species. Anales del Jardín Botánico de Madrid 75(1): e069. https://doi.org/10.3989/ajbm.2449.

Fick, S.E. & R.J. Hijmans. 2017. WorldClim 2: new 1km spatial resolution climate surfaces for global land areas. International Journal of Climatology 37(12): 4302-4315.

Fick, S.E. & R.J. Hijmans. 2020. Base de datos WorldClim 2.1. https://github.com/datos-geoespaciales-biodiversidad/python/tree/refs/heads/main/datos/clima/worldclim/2.1-10m-bio.

GBIF.org. 2025. GBIF Occurrence Acianthera csv Download https://doi.org/10.15468/dl.q5th6b.

GBIF.org. 2025. GBIF Acianthera Occurrence Download https://doi.org/10.15468/dl.qk9kvd.

Helmer, E.H.; Gerson, E.A.; Baggett, L.S.; Bird, B.J.; Ruzycki, T.S. & S.M. Voggesser. 2019. Neotropical cloud forests and páramo to contract and dry from declines in cloud immersion and frost. PLoS ONE 14(4):e0213155. https://doi.org/10.1371/journal.pone.0213155. Forest Service Research Data Archive. https://doi.org/10.2737/RDS-2019-0008.

Karremans, A.P.; Bogarin, D.; Díaz-Morales, M.; Fernández, M.; Oses, L. & F. Pupulin. 2016. Phylogenetic reassessment of Acianthera (Orchidaceae: Pleurothallidinae). Harvard Papers in Botany 21(2): 171-187.

Luer, C.A. 2004. Systematics of Pleurothallis subgenus Acianthera (Orchidaceae). Icones Pleurothallidinarium XXVI: 1-75.

POWO. 2025. World Checklist of Vascular Plants en Plants of the World Online. Facilitated by the Royal Botanic Gardens, Kew. Published on the Internet; https://powo.science.kew.org/. Retrieved 15 March 2025.

Sayers, B. & H. du Plooy. 2003. Additions to the orchid flora of Belize, Central America. Lankesteriana 8:1-3.

Solano Gómez, R. 2015. A taxonomic synopsis of the Mexican species of Acianthera (Orchidaceae: Pleurothallidinae) including a new species. Phytotaxa 218(1): 39–60. https://doi.org/10.11646/phytotaxa.218.1.3.

Solano, R. & A. P. Karremans. 2023. A review of Acianthera subgenus Brenesia (Orchidaceae, Pleurothallidinae), with a new species from Mexico. Acta Botanica Mexicana 130: e2225. https://doi.org/10.21829/abm130.2023.2225.

Wilson, A.M. & W. Jetz. 2016. Remotely Sensed High-Resolution Global Cloud Dynamics for Predicting Ecosystem and Biodiversity Distributions. PLoS Biol 14(3): e1002415. https://doi.org/10.1371/journal.pbio.1002415. Data available on-line at http://www.earthenv.org/.