1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! # simple-plot
//! Provides a macro plot!() that plots a one-dimensional vector (impl IntoIterator<Item={number}>) using Plotly.
//!
//! There is no need for complicated settings; simply pass to plot!() the title of the graph and the vectors you wish to plot, and the graph will be displayed.
//!
//! The passed vector is plotted with index on the x-axis and elements as values on the y-axis.
//!
//! # What this library cannot do
//! - Changing the value of the x-axis
//! - Changing the color of a graph
//! etc.
//!
//! If you need these functions, use plotly
//!
//! # Examples
//! ```
//! let range = 0..100;
//! let sin_iter = (0..150).map(|x| (x as f32 / 10.0).sin() * 20.0);
//! let parabola_vec:Vec<i32> = (-10..10).map(|x| x*x - 30).collect();
//! let cos_vec: Vec<f32> = (0..150).map(|x| (x as f32 / 20.0).cos() * 10.0).collect();
//! let cos_slcie: &[f32] = &cos_vec;
//!
//! simple_plot::plot!("title", range, sin_iter, parabola_vec, cos_slcie);
//! ```

pub mod _plotly {
    pub use plotly::{
        common::{Mode, Title},
        layout::Layout,
        Plot, Scatter,
    };
    /// Plot a one-dimensional vector using Plotly.
    ///
    /// The passed vector is plotted with index on the x-axis and elements as values on the y-axis.
    ///
    /// First argument : `&str` Title of the graph
    ///
    /// Second and subsequent arguments: `impl IntoIterator<Item={number}>` Vector(s) to plot.
    ///
    /// # Examples
    /// ```
    /// let range = 0..100;
    /// let sin_iter = (0..150).map(|x| (x as f32 / 10.0).sin() * 20.0);
    /// simple_plot::plot!("title", range, sin_iter);
    /// ```
    #[macro_export]
    macro_rules! plot {
        ($title:expr, $($ys:expr), +) => {
            use simple_plot::_plotly::{Mode, Title, Plot, Scatter,Layout};
            let layout = Layout::new().title(Title::new($title));
            let mut plot = Plot::new();
            $(
                let name = stringify!($ys);
                let (xs, ys):(Vec<_>, Vec<_>) = $ys.into_iter().enumerate().map(|(i, x)| (i as f32, x.clone() as f32)).unzip();
                let trace = Scatter::new(xs, ys)
                    .mode(Mode::Lines)
                    .name(name);
                plot.add_trace(trace);
            )+
            plot.set_layout(layout);
            plot.show();
        }
    }
}