MCPcopy Index your code
hub / github.com/Psy-Fer/kuva

github.com/Psy-Fer/kuva @v0.3.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.3.0 ↗ · + Follow
4,188 symbols 25,814 edges 329 files 1,488 documented · 36%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

kuva

CI License: MIT crates.io docs.rs Downloads kuva conda conda-downloads

A scientific plotting library in Rust. 60 plot types, SVG output, optional PNG/PDF backends, and a CLI binary that renders plots directly from the shell — including in the terminal itself.

All 60 plot types

kuva terminal — Sankey diagram


Quick start

Install the CLI

Step 1 — install Rust (skip if you already have cargo):

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# then restart your shell, or run:
source ~/.cargo/env

Step 2 — install kuva:

# From crates.io — installs to ~/.cargo/bin/ (on your $PATH after rustup setup)
cargo install kuva --features cli

# From a local clone — SVG output only
cargo install --path . --features cli

# From a local clone — with PNG and PDF output
cargo install --path . --features cli,full

After installation, kuva is available anywhere in your shell — no need to reference ./target/release/kuva or set any paths manually.

Use as a library

Add to Cargo.toml:

[dependencies]
kuva = "0.1"

# Optional backends
kuva = { version = "0.1", features = ["png"] }   # PNG output
kuva = { version = "0.1", features = ["pdf"] }   # PDF output
kuva = { version = "0.1", features = ["full"] }  # PNG + PDF

Then in Rust:

use kuva::prelude::*;

let plot = ScatterPlot::new()
    .with_data(vec![(1.0_f64, 2.0), (3.0, 5.0), (5.0, 4.0)])
    .with_color("steelblue")
    .with_legend("samples");

let plots: Vec<Plot> = vec![plot.into()];
let layout = Layout::auto_from_plots(&plots)
    .with_title("My Plot")
    .with_x_label("X")
    .with_y_label("Y");

let svg = render_to_svg(plots, layout);
std::fs::write("my_plot.svg", svg).unwrap();

Use the CLI

# Scatter plot to SVG
kuva scatter data.tsv --x x --y y -o plot.svg

# Volcano plot, label top 20 genes
kuva volcano gene_stats.tsv --name-col gene --x-col log2fc --y-col pvalue --top-n 20

# Ridgeline plot — stacked density curves, one per group
kuva ridgeline samples.tsv --group-by group --value expression --overlap 0.6

# Box plot rendered directly in the terminal
kuva box samples.tsv --group-col group --value-col expression --terminal

Input is auto-detected TSV or CSV. Columns are selectable by name or 0-based index. Pipe from stdin by omitting the file argument. Output defaults to SVG on stdout; use -o file.svg/png/pdf to write a file.


Documentation

Full documentation — plot type reference, API guide, CLI flag reference, themes, palettes, and benchmarks — is at psy-fer.github.io/kuva.


Contributors

Thank you to everyone who has contributed to kuva!

Contributors


Ecosystem

Other Rust plotting libraries worth knowing about:

  • charton: A general-purpose plotting library implementing the Grammar of Graphics in Rust. It offers a declarative API (similar to ggplot2/Altair) that builds complex charts through layer composition. It provides first-class native support for Polars, integrates with the Jupyter/evcxr ecosystem, and can even interoperate with Matplotlib/Altair for hybrid workflows.

Development note

kuva was initially built by hand, with a working library and several plot types already in place before AI tooling was introduced. From that point, development was heavily assisted by Claude (Anthropic) — accelerating the addition of new plot types, the CLI binary, tests, and documentation. The architecture, domain knowledge, and direction remain the author's own; Claude was used as an accelerant, not an author.

This disclaimer was written by Claude as an honest assessment of its own role in the project.

License

MIT

Extension points exported contracts — how you extend this code

IntoRowOffset (Interface)
Allows `with_x_offsets` to accept plain `f64` values (auto-wrapped as `Some`) as well as explicit `Option ` values ( [2 …
src/plot/brick.rs

Core symbols most depended-on inside this repo

map
called by 1363
src/plot/colormap.rs
iter
called by 1332
src/render/palette.rs
clone
called by 1241
src/render/layout.rs
with_title
called by 915
src/plot/text.rs
len
called by 865
src/render/palette.rs
render_scene
called by 814
src/backend/svg.rs
render_multiple
called by 741
src/render/render.rs
write_test_output
called by 717
tests/common/mod.rs

Shape

Function 2,392
Method 1,481
Class 240
Enum 74
Interface 1

Languages

Rust100%
Python1%

Modules by API surface

src/render/render.rs225 symbols
src/render/layout.rs110 symbols
tests/cli_basic.rs83 symbols
src/backend/raster.rs59 symbols
src/render/alluvial_order.rs57 symbols
src/render/figure.rs56 symbols
tests/figure_svg.rs55 symbols
src/plot/network.rs50 symbols
tests/legend_api.rs47 symbols
src/render/math.rs44 symbols
src/plot/quiver.rs43 symbols
src/plot/jointplot.rs43 symbols

For agents

$ claude mcp add kuva \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact