Python port of key CVN visualization workflows from cvncode (MATLAB), focused on production-quality:
- flatmap rendering (including Kendrick-style fsaverage cuts)
- inflated-surface rendering
- sphere/surface lookup compatibility
- layered SVG export for downstream overlays (ROIs/labels)
Documentation: https://cvnpy.readthedocs.io/
cvnpy is now functional for the visualization path and includes:
- lookup generation + caching
- flat/inflated demos
- stat-map overlays with thresholding
- symmetric color limits
- optional colorbar
- optional bilateral inflated insets
- layered SVG output with stable object IDs
- MATLAB-parity nearest-neighbor vertex-to-image mapping for flatmaps
src/cvnpy/core/lookup_images.py: main rendering engine (lookup_images)src/cvnpy/io/surfaces.py: surface + patch loadingsrc/cvnpy/io/metrics.py: per-vertex metric loadingsrc/cvnpy/view/viewpoints.py: named viewpoints (sphere/non-sphere/flat)src/cvnpy/render/colormap.py: MATLAB-like colormap conversion (cmapsign4)examples/flatmap_demo.py: full flatmap pipeline (PNG + layered SVG)examples/inflated_demo.py: inflated-surface rendering demotests/: unit tests for scaffold milestones and colormap behavior
From PyPI:
python -m pip install cvnpyTo run the example scripts from this repository:
git clone https://github.com/Charestlab/cvnpy.git
cd cvnpy
python -m pip install -e ".[dev,docs]"For development and tests:
python -m pytest -qcvnpy needs a FreeSurfer-style subject surf/ directory.
export SUBJECTS_DIR=/path/to/freesurfer/subjectsThen pass --subject fsaverage (or your subject name).
--subject-dir /path/to/nsd_fsaverageThis expects:
/path/to/nsd_fsaverage/
surf/
lh.full.flat.patch.3d
rh.full.flat.patch.3d
lh.inflated
rh.inflated
lh.curv
rh.curv
...
python examples/flatmap_demo.py \
--subject-dir /path/to/nsd_fsaverage \
--hemi lh \
--surftype full.flat.patch.3d \
--view 0,0,0 \
--cache-dir /tmp/cvnpy_cache \
--out out/nsd_lh_flat.pngpython examples/flatmap_demo.py \
--subject-dir /path/to/nsd_fsaverage \
--hemi both \
--surftype full.flat.patch.3d \
--view 0,0,0 \
--cache-dir /tmp/cvnpy_cache \
--out out/nsd_bihemi_flat.pngpython examples/flatmap_demo.py \
--subject-dir /path/to/nsd_fsaverage \
--hemi both \
--surftype full.flat.patch.3d \
--stat-file /path/to/stats/test_corr.npy \
--symmetric-clim \
--absthreshold 0.05 \
--show-colorbar \
--cache-dir /tmp/cvnpy_cache \
--out out/corr_bihemi.pngpython examples/flatmap_demo.py \
--subject-dir /path/to/nsd_fsaverage \
--hemi both \
--stat-file /path/to/stats/test_corr.npy \
--absthreshold 0.05 \
--show-colorbar \
--show-insets \
--inset-viewname lateral \
--out out/corr_bihemi_insets.pngpython examples/flatmap_demo.py \
--subject-dir /path/to/nsd_fsaverage \
--hemi both \
--stat-file /path/to/stats/test_corr.npy \
--show-colorbar \
--out out/corr_bihemi.png \
--out-svg out/corr_bihemi.svgThe SVG contains stable IDs for overlay workflows:
layerscurvstatlabels_lhlabels_rhcolorbarinset_lhandinset_rh(when enabled)
This is designed to support Kendrick-style downstream SVG overlays.
The default data colormap is cmapsign4, ported from:
knkutils/colormap/cmapsign4.m
You can override with --cmap.
- Getting Started
- Flatmap Demo Reference
- Inflated Demo Reference
- Python API Reference
- MATLAB to Python Parity Map
- Troubleshooting
- Development and Release
- Exact pixel-perfect parity with MATLAB outputs is still in progress.
cvnpydoes not ship FreeSurfer/NSD/CVN surface files; users must provide compatible subject data.
This project ports concepts and workflows from cvncode and related CVN tooling by Kendrick Kay and collaborators.