lodviz_core
Core visualization primitives and data structures for lodviz-rs — a pure-Rust, SVG-based data visualization library.
Features
- Tidy Data Model —
DataTable,DataRow, andFieldValuefor heterogeneous, column-oriented data - Grammar of Graphics — Declarative
EncodingandFieldtypes inspired by Vega-Lite - Scales —
LinearScale,BandScale, andOrdinalScalefor mapping data domains to screen ranges - LTTB Downsampling — Largest-Triangle-Three-Buckets algorithm for visual-preserving time-series reduction
- M4 Downsampling — Fast Min-Max-Min-Max algorithm for large OHLC/financial datasets
- Statistical Algorithms — KDE, box-plot stats, mean, median, percentiles
- Theming —
ChartConfigand palette definitions reused across renderers - Accessibility — A11y primitives for screen-reader friendly SVG output
- No
std/ WASM-compatible — Pure logic, no OS runtime dependencies
Installation
Add to your Cargo.toml:
[]
= "0.1"
Usage
Working with data
use ;
let series = Series ;
let dataset = Dataset ;
LTTB downsampling
Reduce 10 000 points to 300 while preserving the visual shape:
use DataPoint;
use lttb_downsample;
let data: =
.map
.collect;
let reduced = lttb_downsample;
assert_eq!;
Scales
use LinearScale;
let scale = new;
let px = scale.map; // → 300.0
Encoding specification
use ;
let enc = new
.x
.y
.color;
Data Pipeline
lodviz_core accetta dati a tre livelli di astrazione, dal più basso al più alto:
[1] Vec<DataPoint> ← raw Rust types, nessun parsing
[2] DataTable / DataRow ← tidy model, colonne eterogenee
[3] parse_csv(&str) ← CSV testuale → DataTable
Livello 1 — Tipi Rust puri
Il tipo di ingresso nativo per i chart è Vec<DataPoint> (x/y di tipo f64),
raggruppato in Series<DataPoint> e poi in Dataset.
Nessun parsing, nessuna allocazione extra: costruisci i dati direttamente.
use ;
let series = new;
let dataset = from_series;
Per chart specializzati esistono tipi dedicati:
| Tipo | Usato da |
|---|---|
Dataset (Vec<Series<DataPoint>>) |
LineChart, ScatterChart, AreaChart |
BarDataset |
BarChart |
Vec<OhlcBar> |
CandlestickChart |
Vec<WaterfallBar> |
WaterfallChart |
Livello 2 — Tidy Data Model
Se i tuoi dati hanno colonne eterogenee (mix di numeri, testo, timestamp),
usa DataTable. Ogni riga è una DataRow (HashMap<String, FieldValue>).
use ;
use ;
// Costruzione manuale
let mut row: DataRow = new;
row.insert;
row.insert;
row.insert;
let table = from_rows;
// Definisci l'encoding: quale colonna → quale asse / canale colore
let enc = new.with_color;
// Converti in Dataset pronto per il chart (fa groupby su "region" in automatico)
let dataset = table.to_dataset;
FieldValue supporta conversione implicita da tipi primitivi Rust:
let v: FieldValue = 3.14_f64.into; // Numeric
let v: FieldValue = "East".into; // Text
let v: FieldValue = true.into; // Bool
Livello 3 — CSV parser
Per caricare CSV (es. da un fetch HTTP lato browser), usa parse_csv:
use parse_csv;
let csv = "\
month,value,region
1,420,North
2,380,South
3,510,North";
let table = parse_csv?;
// → stessa DataTable del livello 2, poi encoding come sopra
Regole del parser:
- Prima riga non vuota e non-commento (
#) → header - Celle numeriche →
FieldValue::Numeric(f64) - Celle non numeriche →
FieldValue::Text - Celle mancanti →
FieldValue::Null
Nota: il parser accetta
&str. Il fetch HTTP e la lettura file sono responsabilità dell'applicazione (nessun I/O in questo crate).
Pipeline completa
CSV &str
──parse_csv()──▶ DataTable
──to_dataset(&enc)──▶ Dataset
──lttb_downsample(n)──▶ Dataset (LOD)
──▶ SVG (lodviz_components)
Algorithm References
- LTTB: Sveinn Steinarsson (2013) — Downsampling Time Series for Visual Representation (PDF)
- M4: Uwe Jugel et al. (2014) — M4: A Visualization-Oriented Time Series Data Aggregation
License
MIT — see LICENSE