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.¶
# @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))


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).
# @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
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 |
# @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)
# @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()
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).
# @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()
# @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()
# @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))

# @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))

Mapeo¶
# @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"
)
# @title Mapa estático de registros de _Acianthera_ spp.
Acianthera_gdf.plot()
<Axes: >
# @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()
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... |
# @title Mapa estático de países
paises_gdf.plot()
<Axes: >
# @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)
)
<Axes: >
# @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
)
<Axes: >
# @title Mapa interactivo de registros de _Acianthera_ spp.
Acianthera_gdf[(Acianthera_gdf['Longitude'] < 0) & (Acianthera_gdf['Latitude'] < 27)].explore()
# @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
# @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)
# @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()
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 |
# @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)
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 |
# @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)
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 |
# @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
Figura 6. Mapa interactivo de Acianthera spp.: riqueza de especies y registros en América.¶
# @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
Mapas raster¶
# @title Instalación de rasterio
!pip install rasterio --quiet
# @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).¶
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'>
# Nombre de la fuente de datos
temperatura_media_anual.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'
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
temperatura_media_anual.mode
'r'
# CRS
temperatura_media_anual.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"]]')
# Resolución (tamaño de cada celda)
temperatura_media_anual.res
(0.16666666666666666, 0.16666666666666666)
# Límites
temperatura_media_anual.bounds
BoundingBox(left=-180.0, bottom=-90.0, right=180.0, top=90.0)
# Metadatos de capa de temperatura media anual
temperatura_media_anual.meta
{'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)}
# @title Mapa de temperatura media anual
rasterio.plot.show(temperatura_media_anual)
<Axes: >
# @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()
# 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¶
# @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
Precipitación pluvial anual (Fick & Hijmans 2020).¶
Precipitación pluvial anual (Fick & Hijmans 2020)¶
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)
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'>
# Nombre de la fuente de datos Precipitacion pluvial anual
Precipitacion_pluvial_anual.name
'https://github.com/datos-geoespaciales-biodiversidad/python/raw/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_12.tif'
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
Precipitacion_pluvial_anual.mode
'r'
# CRS
Precipitacion_pluvial_anual.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"]]')
# Resolución (tamaño de cada celda)
Precipitacion_pluvial_anual.res
(0.16666666666666666, 0.16666666666666666)
# Límites
Precipitacion_pluvial_anual.bounds
BoundingBox(left=-180.0, bottom=-90.0, right=180.0, top=90.0)
# Metadatos de capa de Precipitacion pluvial anual
Precipitacion_pluvial_anual.meta
{'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)}
# @title Mapa de precipitacion pluvial anual
rasterio.plot.show(Precipitacion_pluvial_anual)
<Axes: >
# @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()
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¶
# @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
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)¶
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'>
# Nombre de la fuente de datos Bosque Nuboso
Predicción_Bosque_Nuboso_2019.name
'https://github.com/mayramaldonadom/CursoPhyton2025/raw/main/helmeretal2019_cloudforest_paramo.tif'
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
Predicción_Bosque_Nuboso_2019.mode
'r'
# CRS
Predicción_Bosque_Nuboso_2019.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"]]')
# Resolución (tamaño de cada celda)
Predicción_Bosque_Nuboso_2019.res
(0.00208333333, 0.00208333333)
# Límites
Predicción_Bosque_Nuboso_2019.bounds
BoundingBox(left=-110.507967978275, bottom=-29.999823739751946, right=-33.543384768085005, top=27.06267616894806)
# Metadatos de capa de predicción bosque nuboso 2019.
Predicción_Bosque_Nuboso_2019.meta
{'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)}
# @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)
# @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 :/
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'>
# Nombre de la fuente de datos Bosque Nuboso
Predicción_Bosque_Nuboso_2016.name
'https://data.earthenv.org/cloud/MODCF_CloudForestPrediction.tif'
# Modo de apertura de la fuente de datos (ej. r = lectura, w = escritura)
Predicción_Bosque_Nuboso_2016.mode
'r'
# CRS
Predicción_Bosque_Nuboso_2016.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"]]')
# Resolución (tamaño de cada celda)
Predicción_Bosque_Nuboso_2016.res
(0.008333333333333333, 0.008333333333392604)
# Límites
Predicción_Bosque_Nuboso_2016.bounds
BoundingBox(left=-160.0, bottom=-23.433333333000004, right=160.0, top=23.433333334)
# Metadatos de capa de predicción de bosques nubosos
Predicción_Bosque_Nuboso_2016.meta
{'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)}
# @title Mapa de Predicción de bosques nubosos. **_ibidem_, igual tira todo.**
rasterio.plot.show(Predicción_Bosque_Nuboso_2016)
# @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/.