modist
Interactive distribution widgets for marimo, in the style
of koaning/wigglystuff. Drag the
density curve to shape a distribution, then feed the params straight into a
distribution constructor with a single splat.
Install
uv add modist # or: uv pip install modist (pip install modist)
Quickstart
import marimo as mo
import modist as md
w = mo.ui.anywidget(md.Normal())
w
params = w.value # {'mu': ..., 'sigma': ...}
import pymc as pm
dist = pm.Normal.dist(**params) # or pm.Beta / pm.Gamma
Families
| Widget | Params | Domain | Drag affordances |
|---|---|---|---|
Normal |
mu, sigma |
free | mean line → mu, ±1σ squares → sigma |
Beta |
alpha, beta |
fixed [0, 1] |
mean line → translate, q25/q75 squares → concentrate |
Gamma |
alpha, beta |
edge pinned at 0 | mean line → translate, q25/q75 squares → reshape |
alpha/beta follow the PyMC / statistics convention
(Gamma's beta is the rate, not scipy's scale). The lazy .scipy and
.pymc adapters map to the right parametrization automatically:
n = md.Normal(mu=2.0, sigma=3.0)
n.scipy # <scipy.stats.norm> via loc=/scale=
n.pymc # pm.Normal.dist(mu=2.0, sigma=3.0)
g = md.Gamma(alpha=2.0, beta=3.0)
g.scipy # scipy.stats.gamma(a=2.0, scale=1/3) -- rate handled for you
w.value is a plain dict of the synced traits, so pm.X.dist(**w.value) works
with no conversion.
How it works
Each family is its own anywidget class with a small set of synced parameter
traits (no x_min/x_max/n_points). The view — SVG scaffold, pan/zoom,
draggable hit lines, and per-family math — lives in a self-contained ESM module.
Source JS lives in js/ (js/base.js shared scaffold + one family file,
all importing a vendored copy of jStat for
pdf/cdf/quantile math). Anywidget delivers _esm as a Blob URL, which
cannot resolve relative imports, so esbuild
bundles each family (jStat inlined) into the committed src/modist/static/*.js
files — the same pattern wigglystuff uses for its JS-heavy widgets.
Rebuilding the JS
make js # esbuild js/*.js -> src/modist/static/*.js
make js-watch # rebuild on every edit (for anywidget hot-reload dev)
Requires a local esbuild (npm install --no-save esbuild).
Development
make venv # creates .venv with dev deps + esbuild
make test # pytest
npm run test:js # Playwright JS integration probes (headless Chromium)
Acknowledgements
- jStat — JavaScript statistics library (MIT), vendored and bundled for the pdf/cdf/quantile math.
- wigglystuff — the interaction and architecture model (one class per family, prebuilt ESM per class).
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 modist-0.1.1.tar.gz.
File metadata
- Download URL: modist-0.1.1.tar.gz
- Upload date:
- Size: 85.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6cc90c24d33e15783cbd4e6a52ea745b0189eab5dd99f2569181a548fd740d16
|
|
| MD5 |
e8405ea83efe7620a3c0ddbc29082bd4
|
|
| BLAKE2b-256 |
3ca9215c009bd02604630ca3a42a20d8c0f4849651763916e79294960346a326
|
File details
Details for the file modist-0.1.1-py3-none-any.whl.
File metadata
- Download URL: modist-0.1.1-py3-none-any.whl
- Upload date:
- Size: 88.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
601e237a29ae06689399aac9b7e4d4b845fd7a5054b738a7ba5de4a93070f600
|
|
| MD5 |
db2a7be2f530d00882e31a6182b81d74
|
|
| BLAKE2b-256 |
11b7ce200e40956378b5a3729a54679e7a4726d39f7dedb2f8af5037d6893369
|