use velociplot::prelude::*;
fn main() -> Result<()> {
println!("🦖 velociplot - Histogram example");
let mut data = Vec::new();
let mut seed = 42u64;
for _ in 0..1000 {
seed = (seed.wrapping_mul(1103515245).wrapping_add(12345)) % (1 << 31);
let u1 = seed as f64 / (1u64 << 31) as f64;
seed = (seed.wrapping_mul(1103515245).wrapping_add(12345)) % (1 << 31);
let u2 = seed as f64 / (1u64 << 31) as f64;
let z = (-2.0 * u1.ln()).sqrt() * (2.0 * std::f64::consts::PI * u2).cos();
let value = 50.0 + 15.0 * z; data.push(value);
}
let hist = Histogram::new(&data)
.bin_strategy(BinStrategy::Auto)
.color(Color::from_hex("#2ecc71").unwrap())
.show_outline(true)
.label("Sample Distribution");
let bounds = hist.bounds().unwrap().with_padding(0.1);
let mut canvas = SkiaCanvas::new(800, 600, bounds)?;
canvas.fill_background(&Color::WHITE.to_rgba())?;
let x_axis = Axis::new(AxisPosition::Bottom)
.label("Value")
.tick_count(8)
.show_grid(true);
let y_axis = Axis::new(AxisPosition::Left)
.label("Frequency")
.tick_count(6)
.show_grid(true);
x_axis.draw(&mut canvas)?;
y_axis.draw(&mut canvas)?;
hist.draw(&mut canvas)?;
if let Some(entry) = hist.legend_entry() {
let legend = Legend::new()
.add_entry(entry)
.position(LegendPosition::UpperRight);
legend.draw(&mut canvas)?;
}
canvas.save_png("examples/images/histogram.png")?;
println!("✓ Plot saved to examples/images/histogram.png");
println!(" Distribution of 1000 data points");
println!(" Using automatic binning (Sturges' formula)");
Ok(())
}