Skip to content

Commit fcbb802

Browse files
authored
Merge pull request #292 from oneElectron/main
Expand plot_vector macro to plot multiple vectors
2 parents 54d52e0 + 77e722b commit fcbb802

File tree

1 file changed

+90
-0
lines changed
  • crates/RustQuant_utils/src

1 file changed

+90
-0
lines changed

crates/RustQuant_utils/src/lib.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,72 @@ macro_rules! plot_vector {
8282
.draw()
8383
.unwrap();
8484
}};
85+
($($v:expr),+ => $file:expr) => {{
86+
use plotters::prelude::*;
87+
88+
let series: Vec<_> = vec![$($v),+];
89+
90+
let mut global_min = std::f64::MAX;
91+
let mut global_max = std::f64::MIN;
92+
let mut global_x_max: usize = 0;
93+
for s in series.iter() {
94+
for &val in s.iter() {
95+
if val < global_min {
96+
global_min = val;
97+
}
98+
if val > global_max {
99+
global_max = val;
100+
}
101+
}
102+
if s.len() > global_x_max {
103+
global_x_max = s.len();
104+
}
105+
}
106+
107+
let root = BitMapBackend::new($file, (640, 480)).into_drawing_area();
108+
root.fill(&WHITE).unwrap();
109+
110+
let mut chart = ChartBuilder::on(&root)
111+
.caption($file, ("sans-serif", 30).into_font())
112+
.margin(5)
113+
.x_label_area_size(30)
114+
.y_label_area_size(30)
115+
.build_cartesian_2d(
116+
0f64..(global_x_max as f64),
117+
(global_min * 0.95)..(global_max * 1.05) // 5% padding on y-axis
118+
)
119+
.unwrap();
120+
121+
chart.configure_mesh().draw().unwrap();
122+
123+
let colors = [RED, BLUE, GREEN, CYAN, MAGENTA, YELLOW, BLACK];
124+
125+
for (i, s) in series.iter().enumerate() {
126+
let points: Vec<(f64, f64)> = s
127+
.iter()
128+
.enumerate()
129+
.map(|(idx, &val)| (idx as f64, val))
130+
.collect();
131+
132+
chart
133+
.draw_series(LineSeries::new(points, colors[i % colors.len()]))
134+
.unwrap()
135+
.label(format!("Series {}", i))
136+
.legend(move |(x, y)| {
137+
PathElement::new(
138+
vec![(x, y), (x + 20, y)],
139+
colors[i % colors.len()].clone(),
140+
)
141+
});
142+
}
143+
144+
chart
145+
.configure_series_labels()
146+
.background_style(WHITE.mix(0.8))
147+
.border_style(&BLACK)
148+
.draw()
149+
.unwrap();
150+
}};
85151
}
86152

87153
#[cfg(test)]
@@ -128,4 +194,28 @@ mod tests_plotters {
128194
println!("File does not exist.");
129195
}
130196
}
197+
198+
#[test]
199+
fn test_plot_vector_macro_multi() {
200+
let v1 = [1.0, 2.0, 3.0, 4.0, 5.0, 4.0, 6.0, 3.0, 7.0, 2.0, 8.0, 1.0];
201+
let v2 = [2.0, 3.0, 4.0, 5.0, 4.0, 6.0, 3.0, 7.0, 2.0, 8.0, 1.0, 8.0];
202+
let file = "./plot_macro2.png";
203+
204+
// THIS WORKS.
205+
plot_vector!(v1, v2 => &file);
206+
207+
// Check if the file exists
208+
if std::path::PathBuf::from(file).exists() {
209+
println!("File exists. Attempting to remove...");
210+
211+
// Remove the file
212+
if let Err(e) = std::fs::remove_file(file) {
213+
println!("Failed to remove file");
214+
} else {
215+
println!("Successfully removed file.");
216+
}
217+
} else {
218+
println!("File does not exist");
219+
}
220+
}
131221
}

0 commit comments

Comments
 (0)