Skip to content

Shared x limits

A signal, its derivative and its running integral stacked in three rows whose x limits are all linked with a single call. Zooming into a time interval in any row zooms every row.

Shared x limits

Select the image, or download the PDF, to open the vector figure exported by IronLAB.

Source

The figure is built by the following code.

use std::f64::consts::PI;

use ironlab::prelude::*;

pub const TITLE: &str = "Shared x limits";
pub const DESCRIPTION: &str = "A signal, its derivative and its running integral stacked in three rows whose x limits \
     are all linked with a single call. Zooming into a time interval in any row zooms every row.";

pub fn figure() -> Figure {
    // The signal s(t) = sin t + 0.3 sin 5t, with its derivative and integral from 0 to t worked out by hand.
    let t = linspace(0.0, 4.0 * PI, 401);
    let signal: Vec<f64> = t.iter().map(|t| t.sin() + 0.3 * (5.0 * t).sin()).collect();
    let derivative: Vec<f64> = t.iter().map(|t| t.cos() + 1.5 * (5.0 * t).cos()).collect();
    let integral: Vec<f64> = t
        .iter()
        .map(|t| (1.0 - t.cos()) + 0.06 * (1.0 - (5.0 * t).cos()))
        .collect();

    let mut fig = Figure::new()
        .size_mm(160.0, 120.0)
        .tiles(3, 1)
        .title("A signal with its derivative and integral");
    let rows = [
        (0, &signal, r"$s(t)$"),
        (1, &derivative, r"$\frac{ds}{dt}$"),
        (2, &integral, r"$\int_0^t s\,d\tau$"),
    ];
    for (row, values, label) in rows {
        let mut ax = fig.axes(row, 0);
        ax.plot(&t, values);
        ax.ylabel(label).grid(true);
    }
    fig.axes(2, 0).xlabel("Time $t$ (s)");
    fig.link_all_x().expect("every row shares the same time axis");
    fig
}

Back to the gallery