Altair-style declarative plotting for Rust. High-performance, Polars-friendly, and Wasm-ready.
"Really nice project. ... This works perfectly as an ecosystem." — Ritchie Vink, Creator of Polars
Chart like You Mean It
standard blocks — limitless charts
Charton is a high-performance Rust plotting library featuring a declarative API inspired by Altair. It provides Polars support and bridges the gap to the Python visualization ecosystem (Altair/Matplotlib). Integrated with evcxr_jupyter, it enables seamless interactive data exploration in notebooks.
Add to Cargo.toml:
[dependencies]
charton = "0.5" # Standard (Single-threaded)
charton = { version = "0.5", features = ["parallel"] } # Multi-threaded processing
charton = { version = "0.5", features = ["png"] } # With PNG support
charton = { version = "0.5", features = ["pdf"] } # With PDF support
charton = { version = "0.5", features = ["bridge"] } # With Altair/Matplotlib interopCharton provides a high-level, declarative API. Standard visualizations can be generated using a concise one-liner syntax:
use charton::prelude::*;
// Data: Physical measurements (Height vs. Weight)
let height = vec![160.0, 165.0, 170.0, 175.0, 180.0];
let weight = vec![55.0, 62.0, 68.0, 75.0, 82.0];
// One-liner plotting
chart!(height, weight)?.mark_point()?.encode((alt::x("height"), alt::y("weight")))?.save("out.svg")?;While the chart! macro is a convenient syntactic sugar for rapid prototyping and simple scripts, the underlying Chart::build API is recommended for production environments where explicit data handling is required.
For complex applications, use Chart::build to gain full control over the Dataset lifecycle.
let ds = Dataset::new()
.with_column("height", height)?
.with_column("weight", weight)?;
Chart::build(ds)? // Equivalent to chart!(ds)?
.mark_point()?
.encode((alt::x("height"), alt::y("weight")))?
.save("out.svg")?;Tip: Use
add_columninstead if you need to add columns dynamically within loops or conditional logic.
For Polars users, Charton provides the load_polars_df! macro to seamlessly convert a DataFrame into a Charton-ready Dataset.
use polars::prelude::*;
let df = df![
"height" => vec![160.0, 165.0, 170.0, 175.0, 180.0],
"weight" => vec![55.0, 62.0, 68.0, 75.0, 82.0]
]?;
// Efficiently convert Polars DataFrame to Charton Dataset
let ds = load_polars_df!(df)?;
Chart::build(ds)? // Equivalent to chart!(ds)?
.mark_point()?
.encode((alt::x("height"), alt::y("weight")))?
.save("out.svg")?;Compatibility Note: Charton uses versioned macros to handle Polars' rapid API evolutions. Versions below 0.44 are no longer supported.
| Polars Version | Macro to Use | Status |
|---|---|---|
| 0.53+ | load_polars_df!(df)? |
Latest (Standard) |
| 0.44 - 0.52 | load_polars_v44_52!(df)? |
Legacy Support |
| < 0.44 | N/A | Unsupported |
Inspired by the Grammar of Graphics (as seen in ggplot2 and Altair), Charton replaces rigid templates with a modular, layer-based system. Visualizations are constructed by stacking atomic marks, offering infinite flexibility beyond fixed chart types.
// Create individual layers
let line = chart!(height, weight)?
.mark_line()?
.encode((alt::x("height"), alt::y("weight")))?;
let point = chart!(height, weight)?
.mark_point()?
.encode((alt::x("height"), alt::y("weight")))?;
// Combine into a composite chart
line.and(point).save("layered.svg")?;Charton integrates with evcxr_jupyter for interactive data exploration. Replacing .save() with .show() renders SVGs directly within notebook cells:
Charton supports WebAssembly and modern web frontend; please refer to Charton Docs for details.
Charton bridges Rust with mature visualization ecosystems like Altair and Matplotlib via a high-speed IPC, enabling users to leverage diverse, professional-grade plotting tools within a unified workflow. please refer to Charton Docs for details.
Stop fighting with fragile, hard-coded patches. Charton treats scaling as a Single Source of Truth, making it possible to combine heterogeneous data sources into one plot while maintaining total mathematical consistency across every mark and axis.
This figure demonstrates semantic synchronization in Charton. Point samples and bar backgrounds from different data sources are anchored to a unified scale, ensuring absolute color and spatial consistency.
Designed for precision, Charton provides pixel-perfect control over complex marks. Whether it is a multi-layered ErrorBar for biomedical research or a high-density scatter plot for finance, Charton delivers the aesthetic rigor required by top-tier journals.
![]() NEJM |
Charton |
A reproduction of Figure 1A from the 2021 NEJM landmark study on once-weekly semaglutide for weight management, implemented using Charton.
Please go to the Charton Docs for full documentation.
Charton is licensed under the Apache License 2.0.


