Skip to main content

ggrust

GitHub License: MIT Docs

The Grammar of Graphics, written in Rust, used from Python.

ggrust is a plotting library with a Lets-Plot compatible Python API. Plots are built the familiar ggplot way, layer by layer with +, while the stats, scales, layout and rendering all run in Rust.

It was started for Cellestial, which needed a maintained backend for its Lets-Plot based API. For most code, switching is an import swap: lets_plot -> ggrust.

Data crosses into Rust once, as Arrow, so Polars and pandas frames work directly.

Installation

pip install ggrust
uv add ggrust

Quickstart

import polars as pl
from ggrust import *

frame = pl.DataFrame(
    {
        "height": [150, 162, 171, 180, 168, 175],
        "weight": [52, 60, 68, 82, 65, 74],
        "group": ["a", "a", "b", "b", "c", "c"],
    }
)

plot = (
    ggplot(frame, aes(x="height", y="weight", color="group"))
    + geom_point(size=4)
    + labs(title="Height vs weight")
    + ggsize(600, 400)
)

plot.to_png("plot.png")

Scatter plot coloured by group

In a notebook the plot shows as interactive HTML (tooltips, zoom and pan with ggtb()).

Examples

Distributions

Violins with boxplots on top, using the same layering as ggplot.

Show code
import numpy as np

rng = np.random.default_rng(0)
days = ["Mon", "Tue", "Wed", "Thu", "Fri"]
commute = pl.DataFrame(
    {
        "day": np.repeat(days, 200),
        "minutes": np.concatenate([rng.gamma(4 + i, 6, 200) for i in range(5)]),
    }
)

(
    ggplot(commute, aes(x="day", y="minutes", fill="day"))
    + geom_violin(alpha=0.6)
    + geom_boxplot(width=0.15, fill="white")
    + labs(title="Commute time by weekday")
    + theme_classic()
    + ggsize(600, 400)
)

Violin and boxplot of commute times

Facets

Split a plot into panels by a column.

Show code
months = np.arange(1, 13)
temperature = pl.DataFrame(
    {
        "month": np.tile(months, 3),
        "temp": np.concatenate(
            [10 + 8 * np.sin((months - 3) / 12 * 2 * np.pi) + offset for offset in (0, 5, -4)]
        ),
        "city": np.repeat(["Lisbon", "Athens", "Oslo"], 12),
    }
)

(
    ggplot(temperature, aes(x="month", y="temp", color="city"))
    + geom_line(size=1.2)
    + geom_point()
    + facet_wrap("city", ncol=3)
    + labs(title="Monthly temperature", y="°C")
    + theme_bw()
    + ggsize(900, 350)
)

Monthly temperature faceted by city

What it covers

  • Geoms: point, line, path, bar, col, histogram, boxplot, violin, area ridges, tile, raster, rect, text, label, text/label repel, segment, curve, polygon, rug, imshow, brackets and more.
  • Stats: count, bin, density, smooth, summary, ecdf, contours, 2D bins, ellipses.
  • Scales: continuous, discrete, log, reversed, datetime, hue, manual, gradients, viridis, brewer, secondary axes, axes on any side.
  • Layout: facet_wrap, facet_grid, gggrid with collected legends, coord_fixed, coord_flip, themes (theme_classic, theme_bw, theme_minimal, theme_void, ...).
  • Outputs: SVG, PNG, vector PDF, and interactive HTML through ggsave, with your own fonts (register_font). Dense scatter layers are drawn on a canvas in HTML.

ggrust is a subset of Lets-Plot, not all of it. Features follow what Cellestial and everyday plotting need. See the migration note for the differences.

ggplot2 extensions, built in

Many popular ggplot2 extension packages from R are built into ggrust, under their R function names. Nothing extra to install; Lets-Plot has none of them.

Feature ggrust From the R package
Beeswarm and quasirandom points geom_beeswarm, geom_quasirandom ggbeeswarm
Journal color palettes scale_color_npg, _aaas, _nejm, _lancet, _jama, _jco, _d3, _igv ggsci
Significance tests and labels stat_compare_means, stat_cor, stat_poly_eq ggpubr, ggpmisc
Cluster marks geom_mark_hull, geom_mark_ellipse, geom_mark_rect ggforce
Highlighting gghighlight gghighlight
Point density geom_pointdensity ggpointdensity
Side panels geom_xside*, geom_yside*, ggmarginal ggside
Several color scales in one plot new_scale_fill, new_scale_color, new_scale ggnewscale
Dendrograms hclust, scale_x_dendro, scale_y_dendro, geom_dendrogram legendry, ggh4x, ggdendro
Raincloud plots stat_halfeye, stat_interval, geom_half_violin, geom_half_boxplot, geom_half_point ggdist, gghalves
Figure layouts and panel tags gggrid(design=, tag_levels=), inset_element patchwork
Rasterized layers in vector output rasterize ggrastr, scattermore

ggrust reimplements their behavior in Rust; the R packages and their authors designed it. Examples and credits are in the extensions guide.

Clustered heatmap with a row dendrogram and a side annotation track Penguin species outlined by labelled hulls Scatter plot with density side panels Boxplots with significance brackets

Performance

Compared with Lets-Plot on identical work: same data, every row drawn (Lets-Plot sampling turned off), same output size. Measured on an Apple M4 Pro, ggrust 0.1.0 vs lets-plot 4.11.0.

  • Speed: SVG a median 40x faster (5x to 185x over 23 cases), PNG a median 22x faster (13x to 119x).
  • Memory: a median 14x lower peak memory (3.6x to 220x). A 1M-point scatter PNG peaks at 44 MB above the data in ggrust and 9.6 GB in Lets-Plot.
  • No case was slower. The weakest spots are point-heavy PNGs (13x to 21x) and large SVGs, where ggrust still peaks at 430 MB for 1M points.

Speed-up over Lets-Plot per case Peak memory ratio over Lets-Plot per case

Full methodology, raw numbers and side-by-side output images are in the benchmark report.

Status

Early, but usable: the full Cellestial test suite passes on ggrust. Expect rough edges and API gaps; issues are welcome.

Development

uv sync          # create the dev environment
make develop     # build the Rust extension into .venv
make check       # fmt, clippy, ruff, cargo test, pytest

Roadmap in plan.md, contributor rules in AGENTS.md.

Metadata

Release files for ggrust 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ggrust 0.6.0
File Size Uploaded Provenance Actions
ggrust-0.6.0.tar.gz 2.5 MB With provenance Details for ggrust-0.6.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for ggrust 0.6.0
File Actions
ggrust-0.6.0-cp311-abi3-win_arm64.whl CPython 3.11 abi3 Windows ARM64 Details for ggrust-0.6.0-cp311-abi3-win_arm64.whl
ggrust-0.6.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for ggrust-0.6.0-cp311-abi3-win_amd64.whl
ggrust-0.6.0-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details for ggrust-0.6.0-cp311-abi3-manylinux_2_28_x86_64.whl
ggrust-0.6.0-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details for ggrust-0.6.0-cp311-abi3-manylinux_2_28_aarch64.whl
ggrust-0.6.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details for ggrust-0.6.0-cp311-abi3-macosx_11_0_arm64.whl
ggrust-0.6.0-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details for ggrust-0.6.0-cp311-abi3-macosx_10_12_x86_64.whl

Total release size: 53.2 MB

Release files / ggrust-0.6.0.tar.gz

Download URL ggrust-0.6.0.tar.gz
Size 2.5 MB
Tags Source
SHA-256 checksum
How to use checksums
1386f9101cf3c265d15dc50e019890fe872272adc4fae0316337622923827ce1
BLAKE2b-256 checksum
How to use checksums
e2c56f2411847201d98686e39a6f062a5b4245b7fd6ebb8adcca5e698b010ed9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / ggrust-0.6.0-cp311-abi3-win_arm64.whl

Download URL ggrust-0.6.0-cp311-abi3-win_arm64.whl
Size 8.1 MB
Tags CPython 3.11 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
eda08c8a01d015e2c278653ba3f010e56ddb4944365e6a431e882c7037f1e7d0
BLAKE2b-256 checksum
How to use checksums
06a5b636a66efdfcf8d8cecfc0a1f9870b761153120d7aa7848596f56a3b47ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / ggrust-0.6.0-cp311-abi3-win_amd64.whl

Download URL ggrust-0.6.0-cp311-abi3-win_amd64.whl
Size 8.8 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
97a9ca7fb18defb9117a5311cbaba6422dd8eeb95c544bc09c83142bd45198df
BLAKE2b-256 checksum
How to use checksums
6f95bfccdf42bc723bf01bf681b266e2e54e6ab34b65aade03eb0be31b85b23b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / ggrust-0.6.0-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL ggrust-0.6.0-cp311-abi3-manylinux_2_28_x86_64.whl
Size 8.8 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
c17cf3fd994dd2db708e0a08e8782e1e129668271587cd95baf8902c7502749a
BLAKE2b-256 checksum
How to use checksums
b02139a98601c7ff53daa5c2875d43988728b61942e97bb50b1f868b1cc07b32
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / ggrust-0.6.0-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL ggrust-0.6.0-cp311-abi3-manylinux_2_28_aarch64.whl
Size 8.4 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
b5625149e90c35a4a068b07ebddebabb728f6dd9f804d35bcae1521805e33c8d
BLAKE2b-256 checksum
How to use checksums
eb7c409142aaea2419db1f7cad32099314f94baa913ca8ad0302aad1a9c98f21
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / ggrust-0.6.0-cp311-abi3-macosx_11_0_arm64.whl

Download URL ggrust-0.6.0-cp311-abi3-macosx_11_0_arm64.whl
Size 8.1 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
51f34622c8483f7b329c965107444f5bb949b4fabb015ce6c658d2c6e785a66b
BLAKE2b-256 checksum
How to use checksums
29e2719442a4b52547a5abd75fa06c081c1da4c72ceef0f8f0ffc486827a3cb0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / ggrust-0.6.0-cp311-abi3-macosx_10_12_x86_64.whl

Download URL ggrust-0.6.0-cp311-abi3-macosx_10_12_x86_64.whl
Size 8.5 MB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
14d127b2d054e006456ab734b95e457212809b118a7c89c66bccec0d7bcb3990
BLAKE2b-256 checksum
How to use checksums
6e719a2093f35d0e670c249023f27d8eafdbd6714181b9600e027ecc4ef1aeca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Security for ggrust 0.6.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 7 files in this release have been uploaded with provenance metadata.

Select from 7 files

Attestation for ggrust-0.6.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page