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