scatterpolar/
scatterpolar.rs1use plotlars::{Fill, Legend, Line, Mode, Plot, Rgb, ScatterPolar, Shape, Text};
2use polars::prelude::*;
3
4fn main() {
5 basic_scatter_polar();
7
8 styled_scatter_polar();
10
11 grouped_scatter_polar();
13
14 filled_scatter_polar();
16}
17
18fn basic_scatter_polar() {
19 let directions = vec![0., 45., 90., 135., 180., 225., 270., 315., 360.];
21 let speeds = vec![5.0, 7.5, 10.0, 8.5, 6.0, 4.5, 3.0, 2.5, 5.0];
22
23 let dataset = DataFrame::new(vec![
24 Column::new("direction".into(), directions),
25 Column::new("speed".into(), speeds),
26 ])
27 .unwrap();
28
29 ScatterPolar::builder()
30 .data(&dataset)
31 .theta("direction")
32 .r("speed")
33 .mode(Mode::Markers)
34 .color(Rgb(65, 105, 225))
35 .shape(Shape::Circle)
36 .size(10)
37 .plot_title(Text::from("Wind Speed by Direction").font("Arial").size(20))
38 .build()
39 .plot();
40}
41
42fn styled_scatter_polar() {
43 let categories = vec![0., 72., 144., 216., 288., 360.];
45 let performance = vec![8.0, 6.5, 7.0, 9.0, 5.5, 8.0];
46
47 let dataset = DataFrame::new(vec![
48 Column::new("category".into(), categories),
49 Column::new("performance".into(), performance),
50 ])
51 .unwrap();
52
53 ScatterPolar::builder()
54 .data(&dataset)
55 .theta("category")
56 .r("performance")
57 .mode(Mode::LinesMarkers)
58 .color(Rgb(255, 0, 0))
59 .shape(Shape::Diamond)
60 .line(Line::Solid)
61 .width(3.0)
62 .size(12)
63 .opacity(0.8)
64 .plot_title(
65 Text::from("Performance Radar Chart")
66 .font("Arial")
67 .size(22)
68 .x(0.5),
69 )
70 .build()
71 .plot();
72}
73
74fn grouped_scatter_polar() {
75 let dataset = LazyCsvReader::new(PlPath::new("data/product_comparison_polar.csv"))
76 .finish()
77 .unwrap()
78 .collect()
79 .unwrap();
80
81 ScatterPolar::builder()
82 .data(&dataset)
83 .theta("angle")
84 .r("score")
85 .group("product")
86 .mode(Mode::LinesMarkers)
87 .colors(vec![Rgb(255, 99, 71), Rgb(60, 179, 113)])
88 .shapes(vec![Shape::Circle, Shape::Square])
89 .lines(vec![Line::Solid, Line::Dash])
90 .width(2.5)
91 .size(8)
92 .plot_title(Text::from("Product Comparison").font("Arial").size(24))
93 .legend_title(Text::from("Products").font("Arial").size(14))
94 .legend(&Legend::new().x(0.85).y(0.95))
95 .build()
96 .plot();
97}
98
99fn filled_scatter_polar() {
100 let angles: Vec<f64> = (0..=360).step_by(10).map(|x| x as f64).collect();
102 let radii: Vec<f64> = angles
103 .iter()
104 .map(|&angle| 5.0 + 3.0 * (angle * std::f64::consts::PI / 180.0).sin())
105 .collect();
106
107 let dataset = DataFrame::new(vec![
108 Column::new("angle".into(), angles),
109 Column::new("radius".into(), radii),
110 ])
111 .unwrap();
112
113 ScatterPolar::builder()
114 .data(&dataset)
115 .theta("angle")
116 .r("radius")
117 .mode(Mode::Lines)
118 .fill(Fill::ToSelf)
119 .color(Rgb(135, 206, 250))
120 .line(Line::Solid)
121 .width(2.0)
122 .opacity(0.6)
123 .plot_title(Text::from("Filled Polar Area Chart").font("Arial").size(20))
124 .build()
125 .plot();
126}