Fast desktop tool for navigating N-dimensional hypercubes of plots
Project description
juxt
juxt is a fast desktop tool for visually comparing plots across multiple parameter axes. Define axes (model, date, data source, ...) and flip through the resulting image hypercube with keyboard navigation.
juxt comes from juxtapose — placing things side by side to compare. That's the whole idea: flip through congruent plots fast enough to visually identify differences.
Install
pip install juxt
For SSH remote loading:
pip install juxt[ssh]
Quick start
juxt accepts several forms as its first argument:
juxt /path/to/plots/ # auto-detect axes from a directory of images
juxt "plots/{sensor}_{date}.png" # explicit local template
juxt myhost:/path/to/plots/ # remote directory over SSH
juxt "myhost:/path/{sensor}_{date}.png" # remote template over SSH
juxt config.yaml # explicit config file
For directory and remote-directory modes, filenames are split on separators (_ and / by default) and any position with more than one distinct value becomes an axis. You'll be prompted to name the axes on first run; use -a to skip.
Config
Auto-discover mode
Point juxt at a directory and it figures out the axes from the filenames:
juxt /path/to/plots/
Or with an explicit config:
discover:
directory: plots/
separator: "_"
Template mode
For full control, define the template and axes explicitly:
template: "plots/{sensor}_{date}_{overpass}_{source}.png"
axes:
sensor: [ASCAT, SMAP, SMOS]
date: [2024-03-15, 2024-03-16]
overpass: [AM, PM]
source: [L2, L3]
keys:
s: sensor
d: date
o: overpass
r: source
Remote mode (SSH)
Images are downloaded over SFTP at startup and cached locally; navigation afterwards is identical to local use. Auth uses your SSH agent or ~/.ssh/config key, with a password fallback.
remote: myhost # or user@myhost, or user@myhost:port
template: "/data/plots/{sensor}_{date}.png"
axes:
sensor: [ASCAT, SMAP]
date: [2024-03-15, 2024-03-16]
Or pass the remote path directly on the command line — juxt will detect axes from the remote filenames automatically:
juxt myhost:/data/plots/
Requires the SSH extra: pip install juxt[ssh]
Navigation
Default mode is tap. Each axis is assigned one letter key — tap it to step forward, hold Shift to step backward. Every navigation is a single keypress, no modifiers, no menus.
| Key | Action |
|---|---|
← / → |
cycle the active axis |
↑ / ↓ |
cycle the secondary axis |
| lowercase letter | navigate +1 on that axis |
| uppercase letter | navigate −1 on that axis |
Ctrl+letter |
open value picker for that axis |
Space |
toggle between current and previous position |
Home / End |
jump to first / last value |
1–9 |
jump to the Nth value |
Use :mode tap|seek|pin in the command bar to switch navigation modes.
Command mode
Press : to open the command bar (vim-style). Tab-completion narrows candidates as you type.
| Command | Action |
|---|---|
:q |
quit |
:fit |
fit image to window |
:fit height / :fit width |
fit to height or width |
:zoom N |
set zoom to N% |
:fullscreen |
toggle fullscreen |
:mode twin|multi|case |
switch navigation mode |
Controls
Zoom
| Key | Action |
|---|---|
| double-click | fit image to window |
0 |
reset zoom to 100% |
| scroll wheel | step forward / backward on active axis |
Shift + scroll wheel |
step backward / forward on active axis |
Ctrl + scroll wheel |
zoom (anchored under cursor) |
| drag | pan |
View
| Key | Action |
|---|---|
Enter |
toggle fullscreen |
Ctrl+H |
toggle status bar |
Project details
Release history Release notifications | RSS feed
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 juxt-1.1.1.tar.gz.
File metadata
- Download URL: juxt-1.1.1.tar.gz
- Upload date:
- Size: 37.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eaa00044677311ab361a8b3ac2e4e9a0334c82a4283aa36f3fceeceaa847afd7
|
|
| MD5 |
53fd7b15e40443e385900b1a2dda965c
|
|
| BLAKE2b-256 |
a264a6cdb5fcf6d54c24e1d6ee3c819ded93696daeefeb62a106a8dcb394c240
|
Provenance
The following attestation bundles were made for juxt-1.1.1.tar.gz:
Publisher:
publish.yml on ColinMoldenhauer/juxt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
juxt-1.1.1.tar.gz -
Subject digest:
eaa00044677311ab361a8b3ac2e4e9a0334c82a4283aa36f3fceeceaa847afd7 - Sigstore transparency entry: 1630045702
- Sigstore integration time:
-
Permalink:
ColinMoldenhauer/juxt@12bee0fc944dc5fda27f303ce518eced7bbdcde0 -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/ColinMoldenhauer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@12bee0fc944dc5fda27f303ce518eced7bbdcde0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file juxt-1.1.1-py3-none-any.whl.
File metadata
- Download URL: juxt-1.1.1-py3-none-any.whl
- Upload date:
- Size: 249.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff01460947c4b04e8f320ca93ac5c5820ab9091d576a07eecb183de36ac27a7a
|
|
| MD5 |
172294d0bad812c3aa7652d2695201e5
|
|
| BLAKE2b-256 |
455698fa119cf441da9679947f18c998a09d302a46a8b68d06cf14f6d9f88608
|
Provenance
The following attestation bundles were made for juxt-1.1.1-py3-none-any.whl:
Publisher:
publish.yml on ColinMoldenhauer/juxt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
juxt-1.1.1-py3-none-any.whl -
Subject digest:
ff01460947c4b04e8f320ca93ac5c5820ab9091d576a07eecb183de36ac27a7a - Sigstore transparency entry: 1630045723
- Sigstore integration time:
-
Permalink:
ColinMoldenhauer/juxt@12bee0fc944dc5fda27f303ce518eced7bbdcde0 -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/ColinMoldenhauer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@12bee0fc944dc5fda27f303ce518eced7bbdcde0 -
Trigger Event:
push
-
Statement type: