Exploring and visualizing the contributions to MaLAPA 2026 Japan.
🐇 TL;DR: (Jump to visualizations!)
This repo takes the talk/poster metadata from the workshop and turns it into a few plots: which institutions contributed, where in the world they are, and how institutions collaborated with one another.
Two Jupyter notebooks do the work:
step_1_prepare_data.ipynb— data prep. Inspects the raw JSON exported from the Indico event, flags which submissions are posters, attaches each author's institution info, prints some summary stats, and writes a cleaned‑upstep_1_output/contributions_rewritten.json.step_2_explore_contributions.ipynb— the plots. Reads the cleaned data and produces the interactive (Plotly) figures:- Contributions by First Speaker Institution — bar chart
- Contributions by Location — world map of contributing institutions
- Institution Collaboration Network — who co‑authored with whom (also grouped by country)
Notebook 2 saves a rendered PNG snapshot of each plot into step_2_output/
(checked in), so you can preview them without running anything. See
step_2_output/README.md for a gallery of the
plots and the institutions-by-community table.
Data is split into one input folder and one output folder per notebook, so it's clear what is source material and what each step produces:
source_data/— the notebooks' input files, checked in so they run out of the box (seesource_data/README.mdfor per-file provenance):contributions.json,poster_submission_numbers.json,manual_to_standard_institutions_dictionary.json— consumed bystep_1_prepare_data.ipynbinstitution_locations.json— institutions with latitude/longitude, used by the map instep_2_explore_contributions.ipynbgroup_photo.jpeg— group photo from the workshop (shown above)
step_1_output/— written by notebook 1:contributions_rewritten.json(the cleaned data that notebook 2 reads) andinstitutions_seen.json(the deduplicated institution list used to seedsource_data/institution_locations.json).step_2_output/— written by notebook 2: a rendered*.pngsnapshot of each of the four plots, andinstitution_submissions_by_community.txt(the per-community institution listing printed at the end of the notebook).
This project uses uv to manage Python and its
dependencies. uv is a fast, all‑in‑one replacement for pip/venv — it reads
pyproject.toml + uv.lock and builds an exact, reproducible environment for
you, so you don't have to create a virtualenv or pip install anything by hand.
macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh(macOS users can also use brew install uv.) On Windows, see the
uv install docs.
From the repo root:
uv syncThis creates a .venv/ and installs the pinned dependencies (Python 3.11,
JupyterLab, pandas, plotly, networkx, pycountry, …). You don't need to activate
anything — prefix commands with uv run and uv uses this environment
automatically.
If you'll commit notebook changes: notebooks are tracked with their outputs but with volatile metadata (execution counts, cell metadata) stripped, via nbstripout. The filter lives in
.git/config(not committed), so configure it once per clone:uv run nbstripout --install --keep-output git config filter.nbstripout.clean 'uv run --quiet nbstripout --keep-output'
--installalone doesn't reliably keep--keep-output, so the explicitgit configline is what preserves cell outputs. SeeCLAUDE.mdfor details.
Quick — regenerate all the plots and outputs headlessly:
uv run main.pyThis runs both notebooks in order and writes everything to step_1_output/ and
step_2_output/ (the four plot PNGs and the text report) without opening a
browser — handy for reproducing the outputs after a data update.
Interactive — explore and modify:
uv run jupyter labOpens JupyterLab so you can dig into the notebooks, tweak the analysis, and see the interactive Plotly figures. Run them in order:
step_1_prepare_data.ipynbfirst — readssource_data/and generatesstep_1_output/contributions_rewritten.json.step_2_explore_contributions.ipynbtop to bottom to produce the plots (and the PNG + text outputs instep_2_output/).
Prefer VS Code, Cursor, or PyCharm? After
uv sync, just open a notebook and select the.venvinterpreter as the kernel — nouv runneeded.
