📊 Iced Aksel
iced_aksel is a WIP, "batteries not included", charting crate for
the Iced GUI toolkit, wrapping the Aksel plotting core in an ergonomic
widget. It focuses on rendering large, interactive datasets with customizable
axes, grids, styles, and event handlers that plug directly into your Iced
application logic.
[!WARNING]
The library is still pretty early in development. Breaking changes will occur as we iron out the API.

🔍 Highlights
-
📈 Chart-first widget –
Chartprovides layout and event handling that feels native to Iced apps. -
🪓 Powerful axes – Configure positions, scales, tick/label policies, cursor labels, visibility, and grid renderers per axis. You can even have multiple axes on the same side.
-
🖌️Canvas-like API – Implement
PlotDatato add any shape primitive (shape::Line,shape::Ellipse,shape::Rectangle, etc.) to the plot - Or create your own shape primitives with theShapetrait (Very WIP)! -
📏 Internal Transformation - Handles all the math headaches associated with calculating screen- vs. plot-coordinates.
-
👉 Rich interactivity – Subscribe to click, drag, hover, scroll, and double-click callbacks for both the plot area and individual axes.
-
🎨 Composable styling – Override per-axis/plot styles or swap in entire
style::Catalogs to match your own theming. -
🔥 Performant - The library handles layering and mesh-squashing to ensure proper rendering while maintaining performance!
🔽 Install
Add the following to your Cargo.toml:
[]
= { = "0.14" }
= { = "0.3" }
🌟 Quick Start
use ;
use Ellipse;
use ;
// Initialize IDs for ***individual*** axes
const X_ID: &'static str = "x_id";
const Y_ID: &'static str = "y_id";
// Your own custom plot that implements `PlotData`
Core Concepts
Chartis the widget. It is the primary driver that renders the axes and plots and routes user events.Stateholds every axis definition and is shared between updates and rendering.Axiscontrols domain, scale, position, grid lines, marker, tick labels and more.PlotDatais implemented by your data structures; it receives aPlotbuilder to push shapes into.Shape,Stroke, andMeasuredescribe how primitives are drawn.
🧩 Examples
The workspace ships multiple runnable examples that showcase axes, shapes, interactions, dashboards, and stress tests. From the repository root:
# Core functionality examples
# Fancy Examples
Each example is a separate crate under examples/ so you can copy-paste code
into your own application.
All examples can also be run in the web using trunk:
[!IMPORTANT]
Due to a breaking change to getrandom you might have to enable the
wasm_jsbackend for getrandom when running in WASM by setting the env-var:RUSTFLAGS='--cfg getrandom_backend="wasm_js"'This only applies to examples depending on
getrandom(usually throughrand).
💻 Development
cargo fmtandcargo clippyenforce the workspace style (Clippy perf, correctness, complexity, and style lints are denied).
Contributions are welcome! Feel free to open issues with bug reports, feature ideas, or performance traces that can help steer the roadmap.
[!NOTE]
A nix-devshell is also supplied in the
flake.nixfor Nix users.It can be started by running:
nix develop .