NOTE: The github viewer doesnt support embeded svg in img tags at this time. To view this notebook correctly, use an external viewer. You can view it with vscode as well.
Here is the nbviewer link https://nbviewer.org/github/tiby312/poloto-project/blob/master/poloto-evcxr/example.ipynb
Alternative https://jsvine.github.io/nbpreview/.
First lets import poloto.
:dep hypermelon
:dep poloto
use hypermelon::prelude::*;
use poloto::prelude::*;
use poloto::build;
Next import evcxr rendering for poloto.
:dep poloto-evcxr
use poloto_evcxr::prelude::*;
{ // Hello world example
let data = vec![[0, 0], [1, 2], [2, 3]];
let a = build::plot("label").line(data);
poloto::frame_build()
.data(a)
.build_and_label(("hello world", "x", "y"))
.append_to(poloto::header().light_theme())
.render_evcxr_img();
}
{ // Custom Ticks Example
// hourly trend over one day.
let trend = vec![
0, 0, 0, 0, 0, 3, 5, 5, 10, 20, 50, 60, 70, 50, 40, 34, 34, 20, 10, 20, 10, 4, 2, 0,
];
let plots = poloto::plots!(
build::plot("").histogram((0..).zip(trend)),
build::markers([24], [])
);
let data = poloto::frame_build().data(plots);
let ticks =
poloto::ticks::from_iter((0..).step_by(6)).with_tick_fmt(|&v| format_move!("{} hr", v));
data.map_xticks(|_| ticks)
.build_and_label(("title", "x", "y"))
.append_to(poloto::header().light_theme())
.render_evcxr_img();
}
{ // Custom Tick Format Example
// hourly trend over one day.
let trend = vec![
0, 0, 0, 0, 0, 3, 5, 5, 10, 20, 50, 60, 70, 50, 40, 34, 34, 20, 10, 20, 10, 4, 2, 0,
];
let plots = poloto::plots!(
build::plot("").histogram((0..).zip(trend)),
build::markers([24], [])
);
let data = poloto::frame_build().data(plots);
let data = data.map_xticks(|orig| {
poloto::ticks::from_closure(|a, b, c| {
let orig = poloto::ticks::gen_ticks(orig, a, b, c);
poloto::ticks::from_iter(orig.iter).with_tick_fmt(|&v| format_move!("{} hr", v))
})
});
data.build_and_label(("title", "x", "y"))
.append_to(poloto::header().light_theme())
.render_evcxr_img();
}
{ // Gaussian Example
// See https://en.wikipedia.org/wiki/Gaussian_function
let gau = |sigma: f64, mu: f64| {
use std::f64::consts::TAU;
let s = sigma.powi(2);
let k = (sigma * TAU).sqrt().recip();
move |x: f64| [x, (-0.5 * (x - mu).powi(2) / s).exp() * k]
};
let xs = poloto::util::range_iter([-5.0, 5.0], 200);
let plots = poloto::plots!(
build::plot("σ=1.0").line(xs.clone().map(gau(1.0, 0.0))),
build::plot("σ=0.5").line(xs.clone().map(gau(0.5, 0.0))),
build::plot("σ=0.3").line(xs.clone().map(gau(0.3, 0.0)))
);
poloto::frame_build()
.data(poloto::plots!(build::origin(), plots))
.build_and_label(("gaussian", "x", "y"))
.append_to(poloto::header().light_theme())
.render_evcxr_img();
}
{ // Collatz Example
let collatz = |mut a: i128| {
std::iter::from_fn(move || {
if a == 1 {
None
} else {
a = if a % 2 == 0 { a / 2 } else { 3 * a + 1 };
Some(a)
}
})
.fuse()
};
let svg = poloto::header().with_viewbox_width(1200.0);
let style =
poloto::render::Theme::dark().append(".poloto_line{stroke-dasharray:2;stroke-width:2;}");
let a = (1000..1006).map(|i| build::plot(format!("c({})", i)).line((0..).zip(collatz(i))));
poloto::frame()
.with_tick_lines([true, true])
.with_viewbox(svg.get_viewbox())
.build()
.data(poloto::plots!(poloto::build::origin(), a))
.build_and_label(("collatz", "x", "y"))
.append_to(svg.append(style))
.render_evcxr_img();
}
{ // Styling Example
let theme = poloto::render::Theme::light();
// Style the first plot and its legend image if it is a histogram.
let theme =
theme.append(".poloto0.poloto_histo.poloto_imgs{fill:red;stroke:black;stroke-width:2px}");
// Some attributes have to accessed directly , so use >* to select the rects directly.
let theme = theme.append(".poloto0.poloto_histo.poloto_imgs>*{rx:20px;ry:20px}");
// Style the text of the first legend
let theme = theme.append(".poloto0.poloto_legend.poloto_text{fill:blue;}");
// Style all line plots but not legend img.
let theme = theme.append(".poloto_line.poloto_imgs.poloto_plot{stroke:purple;stroke-width:20px;stroke-dasharray:40px}");
// Style all line plot legend imgs.
let theme = theme.append(".poloto_line.poloto_imgs.poloto_legend{stroke:purple;stroke-width:10px;stroke-dasharray:10px}");
// Style the scatter plots but not legend img
let theme = theme.append(".poloto_scatter.poloto_plot{fill:purple;stroke-width:20px;}");
// Style the scatter plots but not legend img
let theme = theme.append(".poloto_scatter.poloto_plot{fill:purple;stroke-width:20px;}");
// Style the xaxis name
let theme = theme.append(
".poloto_name.poloto_x{fill:orange;stroke-width:20px;font-size:30px;font-style: italic;}",
);
// Style the background
let theme = theme.append(".poloto_background{fill:darkslategray;}");
// Style the text
let theme = theme.append(".poloto_text{fill: peru;}");
// Style the ticks
let theme = theme.append(".poloto_imgs.poloto_ticks{stroke:springgreen;}");
let x = (0..50).map(|x| (x as f64 / 50.0) * 10.0);
let data = poloto::plots!(
build::plot("sin-10").histogram(x.clone().step_by(3).zip_output(|x| x.sin() - 10.)),
build::plot("cos").line(x.clone().zip_output(|x| x.cos())),
build::plot("sin-5").scatter(x.clone().step_by(3).zip_output(|x| x.sin() - 5.))
);
poloto::frame_build()
.data(data)
.build_and_label((
"Demo: you can change the style of the svg file itself!",
"x axis",
"y axis",
))
.append_to(poloto::header().append(theme))
.render_evcxr_img();
}
{ // Bar Example
let data = [
(20, "potato"),
(14, "broccoli"),
(53, "pizza"),
(30, "avocado"),
];
poloto::build::bar::gen_simple("", data, [0])
.label(("Comparison of Food Tastiness", "Tastiness", "Foods"))
.append_to(poloto::header().light_theme())
.render_evcxr_img();
}
{ // Heart Example
// https://mathworld.wolfram.com/HeartCurve.html
let heart = |t: f64| {
[
16.0 * t.sin().powi(3),
13.0 * t.cos() - 5.0 * (2.0 * t).cos() - 2.0 * (3.0 * t).cos() - (4.0 * t).cos(),
]
};
let range = (0..100).map(|x| x as f64 / 100.0).map(|x| x * 6.0 - 3.0);
let canvas = poloto::frame().preserve_aspect().build();
let plots = poloto::plots!(
build::plot("").line_fill_raw(range.map(heart)),
poloto::build::markers([-20.0, 20.0], [-20.0, 20.0])
);
canvas
.data(plots)
.build_and_label(("Heart Graph", "x", "y"))
.append_to(poloto::header().dark_theme())
.render_evcxr_img()
}