Plotting in Rust

Is there any recommended way to plot in rust?

I am using plotters, but it does not seem to integrate easily with ndarray.

More concretely something like

use plotters::prelude::*;
use ndarray::{Array, Array1, Zip};
use ndarray_rand::RandomExt;
use ndarray_rand::rand_distr::{Uniform, StandardNormal};


fn main() {
let drawing_area = BitMapBackend::new("outs/output.png", (600, 400))
    .into_drawing_area();

drawing_area.fill(&WHITE).unwrap();

let mut chart = ChartBuilder::on(&drawing_area)
.caption("Figure Sample", ("Arial", 30))
.set_label_area_size(LabelAreaPosition::Left, 40)
.set_label_area_size(LabelAreaPosition::Bottom, 40)
.build_cartesian_2d(-10.0..(100.0*1.1), -10.0..100.0)
.unwrap();

let ip = Array::random(n_samples, Uniform::new(0., 10.));
chart.draw_series(
    ip.map(|point| TriangleMarker::new((point, 2.*(*point)), 5, &BLUE.mix(0.3))),
)
.unwrap();
}

fails with the following error

error[E0277]: the trait bound `for<'b> &'b plotters::element::TriangleMarker<(&f64, f64), {integer}>: PointCollection<'b, (f64, f64)>` is not satisfied
  --> charts/src/main.rs:69:7
   |
69 | chart.draw_series(
   |       ^^^^^^^^^^^ the trait `for<'b> PointCollection<'b, (f64, f64)>` is not implemented for `&'b plotters::element::TriangleMarker<(&f64, f64), {integer}>`
   |
   = help: the following implementations were found:
             <&'a plotters::element::TriangleMarker<Coord, Size> as PointCollection<'a, Coord>>

For more information about this error, try `rustc --explain E0277`.

Read the error message:

^^^^^^^^^^^ the trait `for<'b> PointCollection<'b, (f64, f64)>` is not implemented for `&'b plotters::element::TriangleMarker<(&f64, f64), {integer}>`

You are not giving the right type - Nothing related to either ndarray or plotters.

You need to make types in your code consistent.

2 Likes

Yikes. My bad.

Plotting revenge?

Slightly off-topic, would Polars integration with Plotters any easier or more difficult? Could not find working example.

There was an old thread where someone wanted to integrate the two (dont think it's been done yet).

1 Like

Thanks. Indeed, that's all I can find from Internet search.

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.