| Crates.io | ruviz |
| lib.rs | ruviz |
| version | 0.1.1 |
| created_at | 2026-01-08 23:44:39.006007+00 |
| updated_at | 2026-01-09 00:03:01.788399+00 |
| description | High-performance 2D plotting library for Rust |
| homepage | |
| repository | https://github.com/Ameyanagi/ruviz |
| max_upload_size | |
| id | 2031313 |
| size | 4,619,621 |
High-performance 2D plotting library for Rust combining matplotlib's ease-of-use with Makie's performance.
use ruviz::prelude::*;
let x: Vec<f64> = (0..50).map(|i| i as f64 * 0.1).collect();
let y: Vec<f64> = x.iter().map(|&x| x * x).collect();
Plot::new()
.line(&x, &y)
.title("Quadratic Function")
.xlabel("x")
.ylabel("y = x²")
.save("plot.png")?;

Result typesBasic: Line, Scatter, Bar, Histogram, Box Plot, Heatmap Distribution: Violin, KDE, ECDF Composition: Pie, Donut Continuous: Contour Polar: Polar Plot, Radar Chart Error: Error Bars (symmetric/asymmetric)
record! macro and easing functionsAdd to your Cargo.toml:
[dependencies]
ruviz = "0.1"
Choose features based on your needs:
[dependencies]
ruviz = { version = "0.1", features = ["parallel", "simd"] }
| Feature | Description | Use When |
|---|---|---|
default |
ndarray + parallel | General use |
parallel |
Multi-threaded rendering | Large datasets |
simd |
Vectorized transforms | Performance-critical |
animation |
GIF animation export | Animated plots |
gpu |
GPU acceleration (experimental) | Real-time rendering |
interactive |
winit window support | Interactive plots |
ndarray_support |
ndarray types | Scientific computing |
polars_support |
DataFrame support | Data analysis |
pdf |
PDF export | Publication output |
full |
All features | Power users |
For minimal builds: default-features = false
use ruviz::prelude::*;
let x = vec![0.0, 1.0, 2.0, 3.0, 4.0];
let y = vec![0.0, 1.0, 4.0, 9.0, 16.0];
Plot::new()
.line(&x, &y)
.title("My First Plot")
.save("output.png")?;
use ruviz::prelude::*;
let x = vec![0.0, 1.0, 2.0, 3.0, 4.0];
Plot::new()
.line(&x, &x.iter().map(|&x| x).collect::<Vec<_>>())
.label("Linear")
.line(&x, &x.iter().map(|&x| x * x).collect::<Vec<_>>())
.label("Quadratic")
.line(&x, &x.iter().map(|&x| x.powi(3)).collect::<Vec<_>>())
.label("Cubic")
.title("Polynomial Functions")
.xlabel("x")
.ylabel("y")
.theme(Theme::publication())
.save("polynomials.png")?;
use ruviz::prelude::*;
let plot1 = Plot::new().line(&x, &y).title("Line").end_series();
let plot2 = Plot::new().scatter(&x, &y).title("Scatter").end_series();
let plot3 = Plot::new().bar(&["A", "B", "C"], &[1.0, 2.0, 3.0]).title("Bar").end_series();
let plot4 = Plot::new().histogram(&data).title("Histogram").end_series();
subplots(2, 2, 800, 600)?
.suptitle("Scientific Analysis")
.subplot(0, 0, plot1)?
.subplot(0, 1, plot2)?
.subplot(1, 0, plot3)?
.subplot(1, 1, plot4)?
.save("subplots.png")?;
use ruviz::prelude::*;
// 100K points with parallel rendering (enable "parallel" feature)
let x: Vec<f64> = (0..100_000).map(|i| i as f64).collect();
let y: Vec<f64> = x.iter().map(|&x| x.sin()).collect();
Plot::new()
.line(&x, &y)
.title("Large Dataset")
.save("large.png")?;
use ruviz::prelude::*;
use ruviz::animation::RecordConfig;
use ruviz::record;
let x: Vec<f64> = (0..100).map(|i| i as f64 * 0.1).collect();
let config = RecordConfig::new().max_resolution(800, 600).framerate(30);
record!(
"wave.gif",
2 secs,
config: config,
|t| {
let phase = t.time * 2.0 * std::f64::consts::PI;
let y: Vec<f64> = x.iter().map(|&xi| (xi + phase).sin()).collect();
Plot::new()
.line(&x, &y)
.title(format!("Wave Animation (t={:.2}s)", t.time))
.xlim(0.0, 10.0)
.ylim(-1.5, 1.5)
}
)?;

Rust's plotting ecosystem has several options, but each has trade-offs:
| Library | Approach | Limitation |
|---|---|---|
| plotters | Low-level drawing API | Verbose, requires boilerplate for common plots |
| plotly.rs | JavaScript bindings | Requires JS runtime, web-focused |
| plotpy | Python/matplotlib wrapper | Requires Python installed |
ruviz fills the gap with:
Plot::new().line().title().save() - no boilerplate// plotters: ~30 lines for a simple line plot
// ruviz: 4 lines
Plot::new()
.line(&x, &y)
.title("My Plot")
.save("plot.png")?;
Contributions welcome! Please read CONTRIBUTING.md for guidelines.
# Clone repository
git clone https://github.com/Ameyanagi/ruviz.git
cd ruviz
# Setup pre-commit hooks (recommended)
make setup-hooks
# Run code quality checks
make check
# Run tests
cargo test --all-features
# Run examples
cargo run --example basic_example --release
# Run benchmarks
cargo bench --all-features
The pre-commit hooks will automatically run cargo fmt --check and cargo clippy before each commit to ensure code quality.
Licensed under either of:
at your option.
Status: v0.1 - Early development, API may change. Production use at your own risk.
Support: Open an issue or start a discussion