Interactive Jupyter widgets for NWB video and pose visualization
Project description
nwb-video-widgets
Interactive Jupyter widgets for NWB video and pose estimation visualization. Built with anywidget for compatibility across JupyterLab, Jupyter Notebook, VS Code, and Google Colab.
Table of Contents
Installation
For local only NWB file usage:
pip install nwb-video-widgets
For DANDI integration and streaming support:
pip install nwb-video-widgets[dandi]
Video Player Widgets
Multi-camera synchronized video player with configurable layout (Row, Column, or Grid).
Features:
- Interactive settings panel for video selection
- Multiple layout modes (Row, Column, Grid)
- Synchronized playback across all videos
- Session time display with NWB timestamps
DANDI Streaming
Use NWBDANDIVideoPlayer for videos hosted on DANDI:
from dandi.dandiapi import DandiAPIClient
from nwb_video_widgets import NWBDANDIVideoPlayer
client = DandiAPIClient()
dandiset = client.get_dandiset("000409", "draft")
asset = dandiset.get_asset_by_path("sub-NYU-39/sub-NYU-39_ses-..._behavior.nwb")
widget = NWBDANDIVideoPlayer(asset=asset)
widget
Local Files
Use NWBLocalVideoPlayer for local NWB files:
from pynwb import read_nwb
from nwb_video_widgets import NWBLocalVideoPlayer
nwbfile = read_nwb("experiment.nwb")
widget = NWBLocalVideoPlayer(nwbfile)
widget
Fixed Grid Layout
When you know exactly which videos you want to display and how to arrange them, use the video_grid parameter to bypass the interactive settings panel. This is useful for:
- Reproducible notebooks where you want consistent output
- Presentations or demos with predetermined layouts
- Embedding widgets in dashboards or reports
The video_grid parameter accepts a 2D list where each inner list represents a row of videos:
# Single row of three cameras
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[["VideoLeftCamera", "VideoBodyCamera", "VideoRightCamera"]]
)
# 2x2 grid layout
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[
["VideoLeftCamera", "VideoRightCamera"],
["VideoBodyCamera", "VideoTopCamera"],
]
)
# Asymmetric grid (2 videos on top, 1 on bottom)
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[
["VideoLeftCamera", "VideoRightCamera"],
["VideoBodyCamera"],
]
)
The same parameter works with NWBDANDIVideoPlayer:
widget = NWBDANDIVideoPlayer(
asset=asset,
video_grid=[["VideoLeftCamera", "VideoRightCamera"]]
)
Video names that don't exist in the NWB file are silently skipped.
Custom Video Labels
By default, the video name from the NWB file is displayed under each video. Use the video_labels parameter to provide custom display names:
widget = NWBLocalVideoPlayer(
nwbfile,
video_grid=[["VideoLeftCamera", "VideoRightCamera"]],
video_labels={
"VideoLeftCamera": "Left",
"VideoRightCamera": "Right",
}
)
Videos not in the dictionary will display their original name.
Pose Estimation Widgets
Overlays DeepLabCut keypoints on streaming video with support for camera selection.
Features:
- Camera selection via settings panel
- Keypoint visibility toggles (All/None/individual)
- Label display toggle
- Session time display (NWB timestamps)
- Custom keypoint colors via colormap or explicit hex values
- Supports split files (videos in raw file, pose in processed file)
DANDI Streaming
Use NWBDANDIPoseEstimationWidget for DANDI-hosted files:
from dandi.dandiapi import DandiAPIClient
from nwb_video_widgets import NWBDANDIPoseEstimationWidget
client = DandiAPIClient()
dandiset = client.get_dandiset("000409", "draft")
# Single file (videos + pose in same file)
asset = dandiset.get_asset_by_path("sub-.../sub-..._combined.nwb")
widget = NWBDANDIPoseEstimationWidget(asset=asset)
# Or split files (videos in raw, pose in processed)
raw_asset = dandiset.get_asset_by_path("sub-.../sub-..._desc-raw.nwb")
processed_asset = dandiset.get_asset_by_path("sub-.../sub-..._desc-processed.nwb")
widget = NWBDANDIPoseEstimationWidget(
asset=processed_asset,
video_asset=raw_asset,
)
widget
Local Files
Use NWBLocalPoseEstimationWidget for local NWB files:
from pynwb import read_nwb
from nwb_video_widgets import NWBLocalPoseEstimationWidget
# Single file
nwbfile = read_nwb("experiment.nwb")
widget = NWBLocalPoseEstimationWidget(nwbfile)
widget
# Or split files
nwbfile_raw = read_nwb("raw.nwb")
nwbfile_processed = read_nwb("processed.nwb")
widget = NWBLocalPoseEstimationWidget(
nwbfile=nwbfile_processed,
video_nwbfile=nwbfile_raw,
)
widget
Parameters:
| Parameter | Type | Description |
|---|---|---|
keypoint_colors |
str or dict |
Matplotlib colormap name (e.g., 'tab10') or dict mapping keypoint names to hex colors |
default_camera |
str |
Camera to display initially |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nwb_video_widgets-0.1.1.tar.gz.
File metadata
- Download URL: nwb_video_widgets-0.1.1.tar.gz
- Upload date:
- Size: 3.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3a1a6097ec8c259d02be039c1999279cfdacff1358e694456e71c57cef2af29
|
|
| MD5 |
639383b13ef4aa99631d3a5dbdaf894c
|
|
| BLAKE2b-256 |
258e96d65b5f87d211b7279e5dc4e37b8200e6e4171a90e5b0fb71be2d78d553
|
Provenance
The following attestation bundles were made for nwb_video_widgets-0.1.1.tar.gz:
Publisher:
auto-publish.yml on catalystneuro/nwb-video-widgets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nwb_video_widgets-0.1.1.tar.gz -
Subject digest:
f3a1a6097ec8c259d02be039c1999279cfdacff1358e694456e71c57cef2af29 - Sigstore transparency entry: 906186554
- Sigstore integration time:
-
Permalink:
catalystneuro/nwb-video-widgets@114d67a9b07a3ee2d9538e688f5493be9679a0a0 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/catalystneuro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
auto-publish.yml@114d67a9b07a3ee2d9538e688f5493be9679a0a0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file nwb_video_widgets-0.1.1-py3-none-any.whl.
File metadata
- Download URL: nwb_video_widgets-0.1.1-py3-none-any.whl
- Upload date:
- Size: 39.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a3b2ff1d0d6ae00b6121ce750d922b3014ed59afe0a364b5fa7f02b6e4235e6
|
|
| MD5 |
1c31e20151daf75ca2e70df40a9ed499
|
|
| BLAKE2b-256 |
a70ceee0115f26d2bcbfb59b06d540b530e9b4b1b88020e0d4748dab92a5594e
|
Provenance
The following attestation bundles were made for nwb_video_widgets-0.1.1-py3-none-any.whl:
Publisher:
auto-publish.yml on catalystneuro/nwb-video-widgets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nwb_video_widgets-0.1.1-py3-none-any.whl -
Subject digest:
1a3b2ff1d0d6ae00b6121ce750d922b3014ed59afe0a364b5fa7f02b6e4235e6 - Sigstore transparency entry: 906186618
- Sigstore integration time:
-
Permalink:
catalystneuro/nwb-video-widgets@114d67a9b07a3ee2d9538e688f5493be9679a0a0 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/catalystneuro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
auto-publish.yml@114d67a9b07a3ee2d9538e688f5493be9679a0a0 -
Trigger Event:
release
-
Statement type: