Skip to main content

histogram/
histogram.rs

1use ggplot_rs::prelude::*;
2use polars::prelude::*;
3
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5    // Generate approximate normal distribution using central limit theorem
6    let values: Vec<f64> = (0..1000)
7        .map(|i: i32| {
8            // Sum of pseudo-random uniform values → approx normal by CLT
9            let r1 = ((i * 1237 + 5678) % 1000) as f64 / 1000.0;
10            let r2 = ((i * 8731 + 4321) % 1000) as f64 / 1000.0;
11            let r3 = ((i * 4567 + 8901) % 1000) as f64 / 1000.0;
12            let r4 = ((i * 6543 + 2109) % 1000) as f64 / 1000.0;
13            let r5 = ((i * 3571 + 7654) % 1000) as f64 / 1000.0;
14            let r6 = ((i * 9137 + 3456) % 1000) as f64 / 1000.0;
15            // Sum of 6 uniforms: mean=3, std≈0.745; normalize to mean=0, std≈1.5
16            (r1 + r2 + r3 + r4 + r5 + r6 - 3.0) * 2.0
17        })
18        .collect();
19
20    let df = df! {
21        "measurement" => values,
22    }?;
23
24    GGPlot::new(df)
25        .aes(Aes::new().x("measurement"))
26        .geom_histogram_with(GeomHistogram {
27            bins: 25,
28            ..Default::default()
29        })
30        .title("Distribution of Measurements")
31        .xlab("Value")
32        .ylab("Frequency")
33        .save("histogram.svg")?;
34
35    println!("Saved histogram.svg");
36    Ok(())
37}