Mis fotos del año 2009

Python
pyinaturalist
seaborn
wordcloud
Español
Venezuela
Italia
Papilionoidea
Author

José R. Ferrer-Paris

Published

August 31, 2025

Modified

August 31, 2025

En el año 2009 continuamos con proyecto sobre la relación entre la mariposa Kricogonia lyside y el Guayacán (Guaiacum officinale) y nos preparamos para otra temporada de muestreo del proyecto NeoMapas. Un año muy interesante con varias salidas de campo por diferentes regiones de Venezuela.

Para poner estas observaciones de 2009 en contexto temporal de mis contribuciones a iNat, pueden revisar este gráfico

Después de terminar de actualizar mis observaciones de 2008, 2010 y otros años, he decidido repetir el proceso para el año 2009. Este documento me permite visualizar las fotos que ya están en iNaturalist y así evitar subir fotos por duplicado.

Lamentablemente solo tomamos unas pocas fotos en algunos de los viajes de este año, y entre ellas no he encontrado muchas fotos para contribuir en iNaturalist.

Cargar módulos en Python

Importamos los módulos necesarios:

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
from datetime import datetime
from pyinaturalist import get_observations
import ipyplot
import seaborn as sns
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from collections import Counter

Y declaramos una función útil para leer los datos temporales de la respuesta del API de iNat:

def as_date(x):
    if type(x) == str:
        y = datetime.strptime(x, "%Y-%m-%d").date()
    else:
        y = datetime.date(x)
    return(y)

Descargar datos

Los datos espaciales de los estados de Venezuela están disponibles a través de esta página del Humanitarian Data Exchange: https://data.humdata.org/dataset/cod-ab-ven Usamos read_file del modulo geopandas para abrir esta capa desde el url de descarga.

zipurl = 'https://data.humdata.org/dataset/5b141d29-534f-4f01-a0bc-41e2f375d925/resource/b6cf4bf5-418a-49ad-80ec-b84d0e0e0d41/download/ven_adm_ine_20210223_shp.zip'
vzla_estados=gpd.read_file(zipurl, 
                           layer='ven_admbnda_adm1_ine_20210223',
                          columns=['ADM1_ES','geometry'])

Usamos get_observations con un intervalo de fechas que incluye todo el año 2010:

observations = get_observations(user_id='NeoMapas', 
                                d1="2009-01-01",
                                d2="2009-12-31",
                                per_page=1000)

Este número aumenta a medida que cargamos observaciones en iNat:

len(observations['results'])

69

Usamos este loop para guardar la información básica de cada observación:

records=list()
for obs in observations['results']:
    record = {
        'uri':obs['uri'],
        'species guess': obs['species_guess'],
        'location': obs['place_guess'],
        'longitude': obs['location'][1],
        'latitude': obs['location'][0],
        'Fecha_obs': as_date(obs['observed_on']),
        'Fecha_reg': as_date(obs['created_at']),
        'tags': obs['tags']
    }
    if len(obs['observation_photos'])>0:
        record['url'] = obs['observation_photos'][0]['photo']['url'].replace("square","medium")
        record['attribution'] = obs['observation_photos'][0]['photo']['attribution']
    records.append(record)

Y las transformamos en un marco de datos con información espacial para usar con geopandas:

gs = [Point(float(obs['longitude']), float(obs['latitude']))  for obs in records]
inat_obs=gpd.GeoDataFrame(records, geometry=gs, crs="EPSG:4326")

Añadimos una columna con el mes de la observación:

inat_obs['mes'] = [fobs.month for fobs in inat_obs['Fecha_obs']]

Resumen de las observaciones por estado

Primero combinamos la información de iNat con los estados de Venezuela. Usamos la función sjoin_nearest porque algunas observaciones provienen de la costa y las coordenadas de especies amenazadas están protegidas.

crs_lacanoa="EPSG:24719"
inat_obs_estados = gpd.sjoin_nearest(
    inat_obs.to_crs(crs_lacanoa), 
    vzla_estados.to_crs(crs_lacanoa), 
    distance_col="distances", 
    how="left", 
    max_distance=50000,
    lsuffix='in',
    rsuffix='vzla')
inat_obs_estados.fillna({'ADM1_ES':'No info'},inplace=True)

Hacemos una tabla de contingencia usando el estado y el mes de observación:

data_crosstab = pd.crosstab(inat_obs_estados['ADM1_ES'],
                            inat_obs_estados['mes'], 
                               margins = True)

Y mostramos esta información gráficamente usando una de las funciones del paquete seaborn:

plt.figure(figsize=(8, 6))
sns.heatmap(data_crosstab, annot=True, fmt='d', cmap='YlGnBu', linewidths=.5)
plt.title('Observaciones por estado')
plt.ylabel('Estados')
plt.xlabel('Mes del año')
plt.tight_layout()
plt.show()

Observaciones etiquetadas

Algunas observaciones cuentan con etiquetas o tags:

inat_obs['ntags'] = [len(x) for x in inat_obs.tags]
inat_obs.groupby('ntags').agg({'uri':'count'})

uri
ntags
0 15
1 49
2 3
3 1
6 1

Podemos calcular la frecuencia de cada etiquetas usando la función Counter:

taglist=list()
for x in inat_obs.tags:
    taglist = taglist + x
tagcounts=Counter(taglist)
tagcounts

Counter({
    'Muestreos de NeoMapas': 53,
    'NM02': 1,
    'NM27': 1,
    'NM09': 1,
    'endemic butterflies': 1,
    'NeoMapas': 1,
    'Mariposas de Venezuela': 1,
    'parques nacionales': 1,
    'Mamíferos': 1,
    'Cordillera de Mérida': 1,
    'Laguna de Mucubají': 1,
    'páramos': 1
})

Y visualizar estas frecuencias con una nube de palabras (WordCloud):

wordcloud = WordCloud(colormap='plasma', width = 1000, height = 150).generate_from_frequencies(tagcounts)
plt.figure(figsize=(15,8))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

Progreso

Aquí se puede ver el progreso que he hecho en cargar las fotos del año 2008, creo que estas son todas las que tengo respaldadas:

aggfuns = {
    'Fecha_obs': ["min", "max"],
    'location': ['count',pd.Series.nunique],
    'species guess': [pd.Series.nunique],
           }
inat_obs.groupby('Fecha_reg').agg(aggfuns)

Fecha_obs location species guess
min max count nunique nunique
Fecha_reg
2015-06-14 2009-05-16 2009-05-16 1 1 1
2020-09-19 2009-05-16 2009-05-16 1 1 1
2021-05-24 2009-06-10 2009-06-10 1 1 1
2021-06-01 2009-01-23 2009-06-13 10 3 10
2023-11-18 2009-05-16 2009-05-16 1 1 1
2024-11-16 2009-03-12 2009-03-12 3 2 3
2025-03-21 2009-04-08 2009-04-22 16 7 15
2025-03-22 2009-02-19 2009-04-24 26 10 23
2025-08-14 2009-01-26 2009-01-26 2 1 2
2025-08-31 2009-01-17 2009-02-22 8 7 8

Todas las observaciones

Y cierro aquí con todas las imágenes de las observaciones de este año:

Enero

Con estas líneas de código podemos filtrar por fecha de observación:

ss = inat_obs['mes'] == 1
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Bradypus variegatus

https://inaturalist-open-data.s3.amazonaws.com/photos/560305122/medium.jpg

roughbark lignum-vitae

https://inaturalist-open-data.s3.amazonaws.com/photos/560303784/medium.jpg

Poekilloptera

https://inaturalist-open-data.s3.amazonaws.com/photos/560254799/medium.jpg

Boa Constrictor

https://inaturalist-open-data.s3.amazonaws.com/photos/552208019/medium.jpg

Turkey Vulture

https://inaturalist-open-data.s3.amazonaws.com/photos/552208005/medium.jpg

Charidotis abrupta

https://inaturalist-open-data.s3.amazonaws.com/photos/133241197/medium.jpeg

Checkerspots

https://inaturalist-open-data.s3.amazonaws.com/photos/133240945/medium.jpeg

Monarch

https://inaturalist-open-data.s3.amazonaws.com/photos/133240863/medium.jpeg

Phoebis agarithe

https://inaturalist-open-data.s3.amazonaws.com/photos/133235872/medium.png

palms

https://inaturalist-open-data.s3.amazonaws.com/photos/133235660/medium.png

Utricularia alpina

https://inaturalist-open-data.s3.amazonaws.com/photos/133235480/medium.png

Guzmania lingulata

https://inaturalist-open-data.s3.amazonaws.com/photos/133235445/medium.png

Pharneuptychia estoraquensis

https://inaturalist-open-data.s3.amazonaws.com/photos/133235402/medium.png

Febrero

ss = inat_obs['mes'] == 2
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Dryas iulia

https://inaturalist-open-data.s3.amazonaws.com/photos/560251867/medium.jpg

Pinzona coriacea

https://inaturalist-open-data.s3.amazonaws.com/photos/560248853/medium.jpg

Hevea

https://inaturalist-open-data.s3.amazonaws.com/photos/560234510/medium.jpg

Donkey

https://inaturalist-open-data.s3.amazonaws.com/photos/560223537/medium.jpg

Espeletia

https://inaturalist-open-data.s3.amazonaws.com/photos/560215697/medium.jpg

Buttercup Tree

https://inaturalist-open-data.s3.amazonaws.com/photos/478555917/medium.jpg

moriche palm

https://inaturalist-open-data.s3.amazonaws.com/photos/478555347/medium.jpg

Yellow-crowned Amazon

https://inaturalist-open-data.s3.amazonaws.com/photos/478538663/medium.jpg

White-eyed Parakeet

https://inaturalist-open-data.s3.amazonaws.com/photos/478538666/medium.jpg

Mourera fluviatilis

https://inaturalist-open-data.s3.amazonaws.com/photos/478531176/medium.jpg

Goliath Pinkfoot Tarantula

https://inaturalist-open-data.s3.amazonaws.com/photos/478530285/medium.jpg

Clusieae

https://inaturalist-open-data.s3.amazonaws.com/photos/478529721/medium.jpg

Pristimantis vilarsi

https://inaturalist-open-data.s3.amazonaws.com/photos/478529314/medium.jpg

Straight-lined Sulphur

https://inaturalist-open-data.s3.amazonaws.com/photos/478527094/medium.jpg

Felder's White

https://inaturalist-open-data.s3.amazonaws.com/photos/478527088/medium.jpg

Statira Sulphur

https://inaturalist-open-data.s3.amazonaws.com/photos/478527078/medium.jpg

Apricot Sulphur

https://inaturalist-open-data.s3.amazonaws.com/photos/478527079/medium.jpg

Protesilaus

https://inaturalist-open-data.s3.amazonaws.com/photos/478527073/medium.jpg

Orangetip Angled-Sulphur

https://inaturalist-open-data.s3.amazonaws.com/photos/478527072/medium.jpg

Apricot Sulphur

https://inaturalist-open-data.s3.amazonaws.com/photos/478527063/medium.jpg

Gracile Capuchins

https://inaturalist-open-data.s3.amazonaws.com/photos/478524805/medium.jpg

Amazon Parrots

https://inaturalist-open-data.s3.amazonaws.com/photos/478524797/medium.jpg

Blue-headed Parrot

https://inaturalist-open-data.s3.amazonaws.com/photos/478524794/medium.jpg

Marzo

En Marzo estuve participando en un curso en Trieste, Italia, y tengo un par de observaciones:

ss = inat_obs['mes'] == 3
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Gulls

https://inaturalist-open-data.s3.amazonaws.com/photos/450689083/medium.png

Black-headed Gull

https://inaturalist-open-data.s3.amazonaws.com/photos/450688023/medium.png

Hooded Crow

https://inaturalist-open-data.s3.amazonaws.com/photos/450687424/medium.png

Abril

ss = inat_obs['mes'] == 4
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Violet-winged Grasshopper

https://inaturalist-open-data.s3.amazonaws.com/photos/478515477/medium.jpg

Blackbeads

https://inaturalist-open-data.s3.amazonaws.com/photos/478515474/medium.jpg

Roughbark Lignum-Vitae

https://inaturalist-open-data.s3.amazonaws.com/photos/478514574/medium.jpg

Roughbark Lignum-Vitae

https://inaturalist-open-data.s3.amazonaws.com/photos/478514573/medium.jpg

Roughbark Lignum-Vitae

https://inaturalist-open-data.s3.amazonaws.com/photos/478514570/medium.jpg

White-tailed Hawk

https://inaturalist-open-data.s3.amazonaws.com/photos/478512563/medium.jpg

Opuntia caracassana

https://inaturalist-open-data.s3.amazonaws.com/photos/478511676/medium.jpg

Libidibia coriaria

https://inaturalist-open-data.s3.amazonaws.com/photos/478511108/medium.jpg

Ministrymon ligia

https://inaturalist-open-data.s3.amazonaws.com/photos/478489611/medium.jpg

Brown Vinesnake

https://inaturalist-open-data.s3.amazonaws.com/photos/478487889/medium.jpg

Horned Screamer

https://inaturalist-open-data.s3.amazonaws.com/photos/478479827/medium.jpg

Legumes, Milkworts, and Allies

https://inaturalist-open-data.s3.amazonaws.com/photos/478479268/medium.jpg

Laughing Falcon

https://inaturalist-open-data.s3.amazonaws.com/photos/478479028/medium.jpg

Figs

https://inaturalist-open-data.s3.amazonaws.com/photos/478474314/medium.png

Attalea

https://inaturalist-open-data.s3.amazonaws.com/photos/478474314/medium.png

Chicken Snake

https://inaturalist-open-data.s3.amazonaws.com/photos/478472139/medium.jpg

Palicourea

https://inaturalist-open-data.s3.amazonaws.com/photos/478472048/medium.jpg

Syngria druidaria

https://inaturalist-open-data.s3.amazonaws.com/photos/478471966/medium.jpg

Tropical King Skimmers

https://inaturalist-open-data.s3.amazonaws.com/photos/478465258/medium.jpg

Cutlass

https://inaturalist-open-data.s3.amazonaws.com/photos/478464298/medium.jpg

South American Common Toad

https://inaturalist-open-data.s3.amazonaws.com/photos/478464120/medium.jpg

Trechalea

https://inaturalist-open-data.s3.amazonaws.com/photos/478464102/medium.jpg

Cane Toad

https://inaturalist-open-data.s3.amazonaws.com/photos/478462808/medium.jpg

Cane Toad

https://inaturalist-open-data.s3.amazonaws.com/photos/478462784/medium.jpg

Mayo

ss = inat_obs['mes'] == 5
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Espeletia

https://inaturalist-open-data.s3.amazonaws.com/photos/335656198/medium.png

Steromapedaliodes chiquinquirana

https://inaturalist-open-data.s3.amazonaws.com/photos/96117037/medium.jpg

Venado de páramo de Mérida

https://inaturalist-open-data.s3.amazonaws.com/photos/2002533/medium.jpg

Junio

ss = inat_obs['mes'] == 6
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Ants

https://inaturalist-open-data.s3.amazonaws.com/photos/133238553/medium.png

moscas del banano

https://inaturalist-open-data.s3.amazonaws.com/photos/133238173/medium.png

Ballena menor

https://inaturalist-open-data.s3.amazonaws.com/photos/131192436/medium.png