neural_network_rs/plotter/
graph_plotter.rs

1use plotters::prelude::*;
2
3pub fn plot_graph(name: &String, data: &Vec<(i32, f64)>) -> Result<(), Box<dyn std::error::Error>> {
4    let path_name = format!("images/{}_history.png", name);
5
6    let root = BitMapBackend::new(&path_name, (640, 480)).into_drawing_area();
7    root.fill(&WHITE)?;
8
9    let x_range = 0..data[data.len() - 1].0;
10    let y_range = 0.0..data
11        .iter()
12        .map(|x| x.1)
13        .max_by(|x, y| x.partial_cmp(y).unwrap())
14        .unwrap();
15
16    let mut chart = ChartBuilder::on(&root)
17        .caption("History-".to_owned() + &name, ("sans-serif", 24).into_font())
18        .margin(5)
19        .x_label_area_size(30)
20        .y_label_area_size(60)
21        .build_cartesian_2d(x_range, y_range)?;
22
23    chart
24        .configure_mesh()
25        .x_desc("Epoch")
26        .y_desc("Cost")
27        .draw()?;
28
29    chart
30        .draw_series(LineSeries::new((0..data.len()).map(|i| data[i]), &RED))?
31        .label("cost")
32        .legend(|(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], &RED));
33
34    chart
35        .configure_series_labels()
36        .background_style(&WHITE.mix(0.8))
37        .border_style(&BLACK)
38        .draw()?;
39
40    root.present()?;
41
42    Ok(())
43}