LabMaps#

Note

By default, we query both HAL and LDB. Don’t hesitate to adapt depending on the use case.

Lab authors#

Lab authors are the main ingredient to analyse a single lab (i.e. a group of researchers). You can create one just with a name and then automatically ask to retrieve the DB endpoints for this author.

[1]:
from gismap.lab import LabAuthor

maria = LabAuthor("Maria Potop")
maria.auto_sources()

Let’s look at the sources:

[2]:
maria.sources
[2]:
[HALAuthor(name='Maria Potop', key='841868', key_type='pid'),
 LDBAuthor(name='Maria Gradinariu', key='p/MariaPotopButucaru')]

Hum, a bit crowded in this specific case. Maybe we can specify a bit:

[3]:
maria.sources = maria.sources[:2]

Note that an author can have many names.

[4]:
maria.aliases
[4]:
['Maria Gradinariu',
 'Maria Gradinariu Potop-Butucaru',
 'Maria Potop Butucaru',
 'Maria Potop-Butucaru']

When using auto_source, you can tell which DBs should be used (LDB, HAL, or DBLP).

[5]:
celine = LabAuthor("Céline Comte")
celine.auto_sources(dbs=["hal"])
celine.sources
[5]:
[HALAuthor(name='Céline Comte', key='celine-comte')]
[6]:
celine = LabAuthor("Céline Comte")
celine.auto_sources(dbs="dblp")
celine.sources
[6]:
[DBLPAuthor(name='Céline Comte', key='179/2173')]
[7]:
celine = LabAuthor("Céline Comte")
celine.auto_sources(dbs="ldb")
celine.sources
[7]:
[LDBAuthor(name='Céline Comte', key='179/2173')]

When the sources of an author are set one can retrieve her publications.

[8]:
[p for p in celine.get_publications().values() if p.year == 2021]
[8]:
[SourcedPublication(title='Load Balancing in Heterogeneous Server Clusters: Insights From a Product-Form Queueing Model.', authors=[LDBAuthor(name='Mark van der Boor', key='202/1688'), LabAuthor(name='Céline Comte')], venue='IWQoS', type='conference', year=2021),
 SourcedPublication(title='Performance Evaluation of Stochastic Bipartite Matching Models.', authors=[LabAuthor(name='Céline Comte'), LDBAuthor(name='Jan-Pieter L. Dorsman', key='135/1486')], venue='EPEW', type='conference', year=2021),
 SourcedPublication(title='Pass-and-swap queues.', authors=[LabAuthor(name='Céline Comte'), LDBAuthor(name='Jan-Pieter L. Dorsman', key='135/1486')], venue='Queueing Syst. Theory Appl.', type='journal', year=2021),
 SourcedPublication(title='Stochastic dynamic matching: A mixed graph-theory and linear-algebra approach.', authors=[LabAuthor(name='Céline Comte'), LDBAuthor(name='Fabien Mathieu', key='66/2077'), LDBAuthor(name='Ana Busic', key='57/3580')], venue='CoRR', type='journal', year=2021)]

Note

Lab authors can have metadata that can be used for display and further analysis. This is not covered in this tutorial.

Your first lab#

In GisMap, a LabMap is a class whose instances have three methods:

  • update_authors automatically refresh the members of the lab. It is useful at creation or when a lab evolves.

  • update_publications makes a full refresh of the publications of a lab. All publications from lab members are considered (temporal filtering may be enabled later).

  • expand adds moons, i.e. additional researchers that gravitate around the lab.

The simplest usable subclass of Lab is ListMap, which uses a list of names. For example, consider the former team Gangsta from my Bell Labs days.

[9]:
from gismap.lab import ListMap

lab = ListMap(
    author_list=[
        "Fabien Mathieu",
        "Philippe Jacquet",
        "Alonso Silva",
        "Anne Bouillard",
        "François Durand (hal: fradurand, ldb:38/11269)",
        "Amira Alloum",
        "Marc-Olivier Buob",
        "Mohamed Lamine Lamali (hal:mohamed-lamine-lamali, ldb: 43/11358)",
    ],
    name="Gangsta",
)
lab.update_authors()
lab.update_publis()
len(lab.publications)
INFO:GisMap:Multiple entries for Philippe Jacquet in hal
INFO:GisMap:Multiple entries for Alonso Silva in hal
INFO:GisMap:Multiple entries for Anne Bouillard in hal
[9]:
542

Maps can be saved with the dump method so you don’t have to re-update them all the time.

When you have a populated lab, you can produce a standalone HTML of the collaboration graph with save_html. That graph is a standalone HTML that can be displayed in a notebook or saved for inclusion in a web page (e.g. with iframe).

You can also display it directly inside a notebook. Using options, you can perform some customization if you want:

[10]:
groups = {"Gangsta": {"color": "rgb(255, 0, 255)"}}
lab.show_html(groups=groups)
© GisMap 2025

Let’s add some context with a few moons.

[11]:
lab.expand(target=4)
[12]:
groups["moon"] = {"display": "Usual Suspects", "color": "rgb(0,255,0)"}
lab.show_html(groups=groups)
© GisMap 2025

Few things about the generated graph:

  • Authors are represented with their initials unless some picture url is provided (implicitly or explicitly).

  • Comets are singletons (authors with no co-publications with the other nodes). They are hidden by default. For example, if you only show the moons / usual suspects, Bernard becomes a comet and is hidden.

  • You can hover an author to get her name. If you click, you have a modal with the list of publications.

  • The width and length of an edge depend on the number of co-publications. If you click you have a modal with the list of co-publications.

How-to: Adding informal “publications”#

Some people have asked for the possibility of manually adding some extra-publications that are not available on the DB. This addition is possible but not fully automated yet. Here is a toy example to show how to do that.

First we need to build a lab.

[13]:
from gismap.lab import ListMap

lab = ListMap(author_list=["Fabien Mathieu", "Céline Comte"], name="Dream Team")
lab.update_authors()
lab.update_publis()

Then we need the key of the publication’s author.

[14]:
lab.authors
[14]:
{'fabien-mathieu': LabAuthor(name='Fabien Mathieu'),
 'celine-comte': LabAuthor(name='Céline Comte')}

Then we need to create the publication. For technical reason, all lab publications are sourced, so we need first to create a publication, assign a unique key to it, then use the result as a source.

[15]:
from gismap.sources.models import Publication, Author
from gismap.sources.multi import SourcedPublication

collab = Publication(authors=[lab.authors['celine-comte'], lab.authors['fabien-mathieu'], Author(name="John Doe")],
                     title="Informal discussions on GisMap", year=2026,
                     type="Unpublished", venue="Zoom meetings")
collab.key = "discussion"
sourced_collab = SourcedPublication.from_sources([collab])

After that is done, all you need is to add the publication to the dictionnary.

[16]:
lab.publications[sourced_collab.key] = sourced_collab
lab.show_html()
© GisMap 2025

Make your own LabMap#

GisMap is intended to make easy the creation of LabMaps in many contexts.

The easiest way to manage a lab, apart from using ListMaps as shown above, is to specify an internal method _author_iterator that returns Lab authors. When it’s done, you can create/refresh LabMaps as you see fit.

How the iterator works is 100% up to you. Most of the time, this is done by scrapping some Web page(s) (see the gallery for examples), but many other options exist, e.g. read authors from a file, from a LDAP…

For example, this is the entire code required for handling the Solace team.