An interactive plotting library for Rust, similar to Matlab plotting.
The fltk-plot crate uses the fltk-rs crate and adds simple, interactive 2D plotting widgets.
Add the following to your project's Cargo.toml file:
[dependencies] fltk-plot = { git = "https://github.com/GuzTech/fltk-plot", branch = "main" } fltk = { version = "^1.3", features = ["fltk-bundled"] }
An example hello world application:
use fltk_plot::windows::figure_window::FigureWindow; use fltk::{app::*, draw::*, enums::*, prelude::*}; fn linspace(arr: &mut Vec<f64>, l: f64, r: f64, len: usize) { let dx = (r - l) / (len - 1) as f64; arr.reserve(len); for i in 0..len { arr.push(l + (i as f64 * dx)); } } fn arrayfun(input: &[f64], output: &mut Vec<f64>, fun: &dyn Fn(f64) -> f64) { output.reserve(input.len()); for i in input.iter() { output.push(fun(*i)); } } fn main() { let app = App::default(); const N: usize = 100; let mut t: Vec<f64> = Vec::with_capacity(N); let mut x: Vec<f64> = Vec::with_capacity(N); let mut y: Vec<f64> = Vec::with_capacity(N); linspace(&mut t, 0.0, 2.0 * std::f64::consts::PI, N); arrayfun(&t, &mut x, &f64::sin); //arrayfun(&t, &mut x, &|x| 10.0 * f64::sin(x)); arrayfun(&t, &mut y, &|x: f64| 0.5 - 0.5 * f64::exp(-x)); let mut fig = FigureWindow::new(640, 480, "Figure 1", 1, 2); fig.plot(&t, &x, LineStyle::Solid, 2, Color::Red, 0); fig.set_hold(true, 0); fig.plot(&t, &y, LineStyle::Dash, 2, Color::Blue, 0); fig.set_hold(false, 0); fig.plot(&x, &y, LineStyle::Solid, 2, Color::Red, 1); fig.set_x_label("Time [s]", 0); fig.set_y_label("Voltage [V]", 0); fig.set_caption("Votage vs. time", 0); fig.set_grid(true, 0); fig.set_x_label("Voltage [V]", 1); fig.set_y_label("Voltage [V]", 1); fig.set_caption("Signal 1 vs Signal 2", 1); fig.set_grid(true, 1); fig.end(); fig.show(); let mut fig2 = FigureWindow::new(640, 480, "Figure 2", 1, 1); fig2.stem(&t, &x, LineStyle::Solid, 2, Color::Green, 0); fig2.set_grid(true, 0); fig2.set_x_label("X label", 0); fig2.set_y_label("Y label", 0); fig2.set_caption("Caption", 0); fig2.end(); fig2.show(); app.run().unwrap(); }
This will display two figure windows which can be interacted with separately:
The mouse interactions are as follows:
- Panning: click and hold middle mouse button
- Resetting back to the initial view: click right mouse button
- Adding a data point: click left mouse button on the plot
- Moving a data point: click left mouse button and move to desired position
- Moving data point label: click middle mouse button on the data point marker and drag to desired position
- Remove a data point: click right mouse button on the data point marker
- Zoom in/out: mouse wheel
- Zoom area: click left mouse button and drag to select the desired area
