use plotlib::{
page::Page,
repr::Plot,
view::ContinuousView,
style::{
PointStyle,
PointMarker,
},
};
use crate::Matrix;
use crate::error::*;
use super::StdFunc;
#[derive(Clone)]
pub struct Plt;
impl Plt {
pub fn evalpure(vec1: &Matrix, vec2: &Matrix) -> Matrix {
let a = vec1.vals();
let b = vec2.vals();
if vec1.rows() != vec2.rows()
|| vec1.cols() != vec2.cols()
{
throw(ImproperDimensions);
return Matrix::empty();
}
let data = a.iter().zip(b).map(|(i, j)| (*i, *j)).collect::<Vec<(f64, f64)>>();
let plot = Plot::new(data).point_style(
PointStyle::new()
.marker(PointMarker::Circle)
.colour("#3264a8"),
);
let v = ContinuousView::new()
.add(plot)
.x_label("Independent")
.y_label("Dependent");
match Page::single(&v).dimensions(150, 40).to_text() {
Ok(p) => println!("{}", p),
Err(_) => throw(CouldNotDisplayPlot),
};
match Page::single(&v).save("plot.svg") {
Ok(_) => (),
Err(_) => throw(CouldNotWriteToFile),
};
Matrix::empty()
}
}
impl StdFunc for Plt {
fn eval(&self, args: Vec<Matrix>) -> Matrix {
if args.len() != 2 {
throw(WrongNumberOfArgs);
return Matrix::new(0, 0, Vec::new());
}
Self::evalpure(&args[0], &args[1])
}
}