scatterplot/
scatterplot.rs

1use plotlars::{Axis, Legend, Plot, Rgb, ScatterPlot, Shape, Text, TickDirection};
2use polars::prelude::*;
3
4fn main() {
5    let dataset = LazyCsvReader::new(PlPath::new("data/penguins.csv"))
6        .finish()
7        .unwrap()
8        .select([
9            col("species"),
10            col("sex").alias("gender"),
11            col("flipper_length_mm").cast(DataType::Int16),
12            col("body_mass_g").cast(DataType::Int16),
13        ])
14        .collect()
15        .unwrap();
16
17    let axis = Axis::new()
18        .show_line(true)
19        .tick_direction(TickDirection::OutSide)
20        .value_thousands(true);
21
22    ScatterPlot::builder()
23        .data(&dataset)
24        .x("body_mass_g")
25        .y("flipper_length_mm")
26        .group("species")
27        .sort_groups_by(|a, b| {
28            if a.len() == b.len() {
29                a.cmp(b)
30            } else {
31                a.len().cmp(&b.len())
32            }
33        })
34        .opacity(0.5)
35        .size(12)
36        .colors(vec![Rgb(178, 34, 34), Rgb(65, 105, 225), Rgb(255, 140, 0)])
37        .shapes(vec![Shape::Circle, Shape::Square, Shape::Diamond])
38        .plot_title(Text::from("Scatter Plot").font("Arial").size(20).x(0.065))
39        .x_title("body mass (g)")
40        .y_title("flipper length (mm)")
41        .legend_title("species")
42        .x_axis(&axis.clone().value_range(vec![2500.0, 6500.0]))
43        .y_axis(&axis.clone().value_range(vec![170.0, 240.0]))
44        .legend(&Legend::new().x(0.85).y(0.15))
45        .build()
46        .plot();
47}