A visit to Rwanda and Uganda

Rwanda
Uganda
Python
pyinaturalist
Folium
Autor/a

José R. Ferrer-Paris

Fecha de publicación

29 de junio de 2025

Fecha de última modificación

11 de febrero de 2026

This post will contain a summary of my iNaturalist observations made during a visit to Rwanda and Uganda for the African Protected Areas Conference (APAC).

This post is still under development. I have not yet organised and uploaded all the observations, here is just a sample of them.

Load Python modules

I always start importing the python modules

import pandas as pd
import folium
from datetime import datetime, timedelta
from pyinaturalist import (
    Observation,
    get_observations,
    pprint,
)
import ipyplot
from itertools import compress

Download iNaturalist observations

I use the get_observations function with a range of dates to query iNaturalist:

observations = get_observations(user_id='NeoMapas', 
                                d1="2022-07-09",
                                d2="2022-07-25",
                                per_page=1000)

Only three dozen or so observations so far (I guess this should be >60)

len(observations['results'])

35

We can print them in a pretty table:

pprint(observations)
                                                                                                                   
  ID          Taxon ID   Taxon                            Observed on    User       Location                       
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
  328303999   3          Class Aves (Birds)               Jul 22, 2022   neomapas   Gasabo, RW-KV, RW              
  328303983   5418       Gypohierax angolensis            Jul 22, 2022   neomapas   Gasabo, RW-KV, RW              
                         (Palm-Nut Vulture)                                                                        
  328303950   3          Class Aves (Birds)               Jul 22, 2022   neomapas   Gasabo, RW-KV, RW              
  328303937   3          Class Aves (Birds)               Jul 22, 2022   neomapas   Gasabo, RW-KV, RW              
  328303913   71261      Order Accipitriformes (Hawks,    Jul 22, 2022   neomapas   Gasabo, RW-KV, RW              
                         Eagles, Kites, And Allies)                                                                
  328303902   3          Class Aves (Birds)               Jul 21, 2022   neomapas   Gasabo, RW-KV, RW              
  328303886   71261      Order Accipitriformes (Hawks,    Jul 21, 2022   neomapas   Gasabo, RW-KV, RW              
                         Eagles, Kites, And Allies)                                                                
  328303179   3          Class Aves (Birds)               Jul 21, 2022   neomapas   kimihurura                     
  328303159   3          Class Aves (Birds)               Jul 21, 2022   neomapas   Kimihurura                     
  328299630   47126      Kingdom Plantae (Plants)         Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
  328299589   47208      Order Coleoptera (Beetles)       Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
  328299575   47126      Kingdom Plantae (Plants)         Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
  328299560   47126      Kingdom Plantae (Plants)         Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
  328299544   47126      Kingdom Plantae (Plants)         Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
  328299524   47126      Kingdom Plantae (Plants)         Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
  328299500   47126      Kingdom Plantae (Plants)         Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
  328299479   47157      Order Lepidoptera (Butterflies   Jul 11, 2022   neomapas   Volcans, RW-NO-MS, RW-NO, RW   
                         And Moths)                                                                                
  328299454   47224      Superfamily Papilionoidea        Jul 10, 2022   neomapas   Gasabo, RW-KV, RW              
                         (Butterflies)                                                                             
  328110752   5268       Milvus migrans (Black Kite)      Jul 09, 2022   neomapas   Gasabo, RW-KV, RW              
  328110728   3          Class Aves (Birds)               Jul 09, 2022   neomapas   Gasabo, RW-KV, RW              
  328110711   721186     Ciconia ciconia ciconia          Jul 09, 2022   neomapas   Gasabo, RW-KV, RW              
                         (European White Stork)                                                                    
  252786946   329894     Genus Desmometopa                Jul 12, 2022   neomapas   Rubanda, Uganda                
  252786184   880641     Ariadne pagenstecheri            Jul 12, 2022   neomapas   Rubanda, Uganda                
  195608311   12792      Cossypha heuglini                Jul 10, 2022   neomapas   Kamukina, Kigali, Rwanda       
                         (White-Browed Robin-Chat)                                                                 
  169357877   32837      Trioceros johnstoni              Jul 12, 2022   neomapas   Kisoro, Uganda                 
                         (Johnston's Chameleon)                                                                    
  169357874   12053      Lanius mackinnoni (Mackinnon's   Jul 12, 2022   neomapas   Kisoro, Uganda                 
                         Shrike)                                                                                   
  169357073   147661     Gorilla beringei beringei        Jul 12, 2022   neomapas   (-1.0333664656,                
                         (Mountain Gorilla)                                         29.6054448052)                 
  169356800   31425      Genus Acanthocercus (Ridgeback   Jul 23, 2022   neomapas   Rugando, Kigali, Rwanda        
                         Agamas)                                                                                   
  169356246   121993     Lampides boeticus (Pea Blue)     Jul 16, 2022   neomapas   Rugando, Kigali, Rwanda        
  169356060   55371      Saxicola torquatus (African      Jul 14, 2022   neomapas   HH97+MG, Kinigi, Rwanda        
                         Stonechat)                                                                                
  169355583   516815     Ceryle rudis rudis (African      Jul 14, 2022   neomapas   Located on Lake Mulehe 10Kms   
                         Pied Kingfisher)                                           along Kisoro-Rubuguri Rd,      
                                                                                    Uganda                         
  169355582   5268       Milvus migrans (Black Kite)      Jul 14, 2022   neomapas   Located on Lake Mulehe 10Kms   
                                                                                    along Kisoro-Rubuguri Rd,      
                                                                                    Uganda                         
  169355580   12985      Muscicapa aquatica (Swamp        Jul 14, 2022   neomapas   Located on Lake Mulehe 10Kms   
                         Flycatcher)                                                along Kisoro-Rubuguri Rd,      
                                                                                    Uganda                         
  169354601   981195     Harpendyreus reginaldi           Jul 13, 2022   neomapas   Mount Sabyinyo, Congo -        
                                                                                    Kinshasa                       
  169354599   8004       Corvus albicollis                Jul 13, 2022   neomapas   Mount Sabyinyo, Congo -        
                         (White-Necked Raven)                                       Kinshasa                       
                                                                                                                   

Map of observations

I have uploaded a selection of observation from different parts of my trip, including an excursion to the Volcanos National Park in Rwanda and the Bwindi National Park in Uganda.

map = folium.Map(tiles="Esri NatGeoWorldMap")
fg = folium.FeatureGroup(name="iNaturalist observations", control=True, attribution="observers @ iNaturalist").add_to(map)
popup_text = """<img src='{url}'>
<caption><i>{species}</i> observed on {observed_on} / {attribution}</caption> {desc}
   """
for obs in observations['results']:
    if obs['quality_grade'] == 'research':
        if obs['description'] is None:
            desc = ""
        else:
            desc = obs['description']
        pincolor = 'green'
    else:
        desc = "Observation is not research quality grade."
        pincolor = 'gray'
    fg.add_child(
        folium.Marker(
            location=obs['location'],
            popup=popup_text.format(
               species=obs['species_guess'],
                observed_on=obs['observed_on'],
                desc=desc,
               url = obs['observation_photos'][0]['photo']['url'],
               attribution = obs['observation_photos'][0]['photo']['attribution']),
            icon=folium.Icon(color=pincolor),
        )
      )
folium.LayerControl().add_to(map)

<folium.map.LayerControl object at 0x127b99e50>
map.fit_bounds(map.get_bounds())
map

Make this Notebook Trusted to load map: File -> Trust Notebook

Travel log

records=list()
for obs in observations['results']:
    record = {
        'uuid': obs['uuid'],
        'quality': obs['quality_grade'],
    'description': obs['description'],
    'location': obs['place_guess'],
    'longitude': obs['location'][1],
    'latitude': obs['location'][0],
    'species guess': obs['species_guess'],
    'Fecha': obs['observed_on'],
    }
    if len(obs['observation_photos'])>0:
        record['url'] = obs['observation_photos'][0]['photo']['url']
        record['attribution'] = obs['observation_photos'][0]['photo']['attribution']
    records.append(record)
inat_obs=pd.DataFrame(records)
inat_obs["dia"]=inat_obs.Fecha.apply(datetime.date)
inat_obs.groupby('dia').agg({'uuid': ['count'],'species guess': ['count',pd.Series.nunique]})

uuid species guess
count count nunique
dia
2022-07-09 3 2 2
2022-07-10 2 2 2
2022-07-11 8 0 0
2022-07-12 5 5 5
2022-07-13 2 2 2
2022-07-14 4 4 4
2022-07-16 1 1 1
2022-07-21 4 3 2
2022-07-22 5 2 2
2022-07-23 1 1 1
my_observations = Observation.from_json_list(observations)
images = [obs.photos[0].small_url for obs in my_observations]
labels = [str(obs) for obs in my_observations]

Welcome to Kigali

ss = [datetime.date(obs.observed_on).strftime('%d/%m/%Y') in ['10/07/2022',] for obs in my_observations]
ipyplot.plot_images(list(compress(images, ss)), list(compress(labels, ss)), max_images=60,)


Observation(id=328299454, taxon=Taxon(id=47224, full_name=Superfamily Papilionoidea (Butterflies)), observed_on=Jul 10, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594873151/small.jpg

Observation(id=195608311, taxon=Taxon(id=12792, full_name=Cossypha heuglini (White-Browed Robin-Chat)), observed_on=Jul 10, 2022, username=neomapas, place_guess=Kamukina, Kigali, Rwanda)

https://inaturalist-open-data.s3.amazonaws.com/photos/344170694/small.jpeg

Mount Bisoke

ss = [datetime.date(obs.observed_on).strftime('%d/%m/%Y') in ['11/07/2022',] for obs in my_observations]
#ipyplot.plot_images(list(compress(images, ss)), list(compress(labels, ss)), max_images=60,)

Bwindi National Park

Gorilla expedition in Bwindi Impenetrable forest

Explore observations on iNaturalist

ss = [datetime.date(obs.observed_on).strftime('%d/%m/%Y') in ['12/07/2022',] for obs in my_observations]
ipyplot.plot_images(list(compress(images, ss)), list(compress(labels, ss)), max_images=60,)


Observation(id=252786946, taxon=Taxon(id=329894, full_name=Genus Desmometopa), observed_on=Jul 12, 2022, username=neomapas, place_guess=Rubanda, Uganda)

https://inaturalist-open-data.s3.amazonaws.com/photos/452557749/small.jpeg

Observation(id=252786184, taxon=Taxon(id=880641, full_name=Ariadne pagenstecheri), observed_on=Jul 12, 2022, username=neomapas, place_guess=Rubanda, Uganda)

https://inaturalist-open-data.s3.amazonaws.com/photos/452555113/small.jpeg

Observation(id=169357877, taxon=Taxon(id=32837, full_name=Trioceros johnstoni (Johnston's Chameleon)), observed_on=Jul 12, 2022, username=neomapas, place_guess=Kisoro, Uganda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293606975/small.jpeg

Observation(id=169357874, taxon=Taxon(id=12053, full_name=Lanius mackinnoni (Mackinnon's Shrike)), observed_on=Jul 12, 2022, username=neomapas, place_guess=Kisoro, Uganda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293606945/small.jpeg

Observation(id=169357073, taxon=Taxon(id=147661, full_name=Gorilla beringei beringei (Mountain Gorilla)), observed_on=Jul 12, 2022, username=neomapas, place_guess=None)

https://inaturalist-open-data.s3.amazonaws.com/photos/293606189/small.jpeg

Mount Sabyinyo

ss = [datetime.date(obs.observed_on).strftime('%Y-%m-%d') in ['2022-07-13'] for obs in my_observations]
ipyplot.plot_images(list(compress(images, ss)), list(compress(labels, ss)), max_images=60,)


Observation(id=169354601, taxon=Taxon(id=981195, full_name=Harpendyreus reginaldi), observed_on=Jul 13, 2022, username=neomapas, place_guess=Mount Sabyinyo, Congo - Kinshasa)

https://inaturalist-open-data.s3.amazonaws.com/photos/293600932/small.jpeg

Observation(id=169354599, taxon=Taxon(id=8004, full_name=Corvus albicollis (White-Necked Raven)), observed_on=Jul 13, 2022, username=neomapas, place_guess=Mount Sabyinyo, Congo - Kinshasa)

https://inaturalist-open-data.s3.amazonaws.com/photos/293600812/small.jpeg

Lake Mulehe


ss = [datetime.date(obs.observed_on).strftime('%Y-%m-%d') in ['2022-07-14'] for obs in my_observations]
ipyplot.plot_images(list(compress(images, ss)), list(compress(labels, ss)), max_images=60,)


Observation(id=169356060, taxon=Taxon(id=55371, full_name=Saxicola torquatus (African Stonechat)), observed_on=Jul 14, 2022, username=neomapas, place_guess=HH97+MG, Kinigi, Rwanda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293604381/small.jpeg

Observation(id=169355583, taxon=Taxon(id=516815, full_name=Ceryle rudis rudis (African Pied Kingfisher)), observed_on=Jul 14, 2022, username=neomapas, place_guess=Located on Lake Mulehe 10Kms along Kisoro-Rubuguri Rd, Uganda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293602765/small.jpeg

Observation(id=169355582, taxon=Taxon(id=5268, full_name=Milvus migrans (Black Kite)), observed_on=Jul 14, 2022, username=neomapas, place_guess=Located on Lake Mulehe 10Kms along Kisoro-Rubuguri Rd, Uganda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293602754/small.jpeg

Observation(id=169355580, taxon=Taxon(id=12985, full_name=Muscicapa aquatica (Swamp Flycatcher)), observed_on=Jul 14, 2022, username=neomapas, place_guess=Located on Lake Mulehe 10Kms along Kisoro-Rubuguri Rd, Uganda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293602727/small.jpeg

Back in Kigali


ss = [datetime.date(obs.observed_on).strftime('%Y-%m-%d') in ['2022-07-16','2022-07-21','2022-07-22','2022-07-23',] for obs in my_observations]
ipyplot.plot_images(list(compress(images, ss)), list(compress(labels, ss)), max_images=60,)


Observation(id=328303999, taxon=Taxon(id=3, full_name=Class Aves (Birds)), observed_on=Jul 22, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594882579/small.jpg

Observation(id=328303983, taxon=Taxon(id=5418, full_name=Gypohierax angolensis (Palm-Nut Vulture)), observed_on=Jul 22, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594882553/small.jpg

Observation(id=328303950, taxon=Taxon(id=3, full_name=Class Aves (Birds)), observed_on=Jul 22, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594882452/small.jpg

Observation(id=328303937, taxon=Taxon(id=3, full_name=Class Aves (Birds)), observed_on=Jul 22, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594882406/small.jpg

Observation(id=328303913, taxon=Taxon(id=71261, full_name=Order Accipitriformes (Hawks, Eagles, Kites, And Allies)), observed_on=Jul 22, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594882360/small.jpg

Observation(id=328303902, taxon=Taxon(id=3, full_name=Class Aves (Birds)), observed_on=Jul 21, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594882317/small.jpg

Observation(id=328303886, taxon=Taxon(id=71261, full_name=Order Accipitriformes (Hawks, Eagles, Kites, And Allies)), observed_on=Jul 21, 2022, username=neomapas, place_guess=Gasabo, RW-KV, RW)

https://inaturalist-open-data.s3.amazonaws.com/photos/594882280/small.jpg

Observation(id=328303179, taxon=Taxon(id=3, full_name=Class Aves (Birds)), observed_on=Jul 21, 2022, username=neomapas, place_guess=kimihurura)

https://inaturalist-open-data.s3.amazonaws.com/photos/594880788/small.jpg

Observation(id=328303159, taxon=Taxon(id=3, full_name=Class Aves (Birds)), observed_on=Jul 21, 2022, username=neomapas, place_guess=Kimihurura)

https://inaturalist-open-data.s3.amazonaws.com/photos/594880762/small.jpg

Observation(id=169356800, taxon=Taxon(id=31425, full_name=Genus Acanthocercus (Ridgeback Agamas)), observed_on=Jul 23, 2022, username=neomapas, place_guess=Rugando, Kigali, Rwanda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293605561/small.jpeg

Observation(id=169356246, taxon=Taxon(id=121993, full_name=Lampides boeticus (Pea Blue)), observed_on=Jul 16, 2022, username=neomapas, place_guess=Rugando, Kigali, Rwanda)

https://inaturalist-open-data.s3.amazonaws.com/photos/293604942/small.jpeg