Multipanel figures
Splitting drawing areas
Plotters can support multiple panel figures very easily by splitting the drawing area into sub-drawing areas. The following code demonstrate how the drawing area is splitted.
use plotters::prelude::*;
fn main() {
let root = BitMapBackend::new("images/split-drawing-area.png", (640, 480)).into_drawing_area();
// We can split to left panel and right panel 25% left, 75% right
let (left, right) = root.split_horizontally((25).percent_width());
left.fill(&YELLOW).unwrap();
// We can also split upper and lower panel
let (upper, lower) = right.split_vertically(240);
upper.fill(&BLUE).unwrap();
// Then we can split the lower area evenly to 3 row 2 col
let lower_areas = lower.split_evenly((2, 3));
for (id, area) in lower_areas.into_iter().enumerate() {
area.fill(&Palette99::pick(id)).unwrap();
}
}
Creating multi-panel figures
With child drawing area, we can easily render multi-panel figures. Here's an example for making multi-panel figures:
use plotters::prelude::*;
fn main() {
let root = BitMapBackend::new("images/multi-panel-figure.png", (640, 480)).into_drawing_area();
root.fill(&WHITE).unwrap();
let (upper, lower) = root.split_vertically((80).percent());
let mut upper_chart = ChartBuilder::on(&upper)
.set_label_area_size(LabelAreaPosition::Left, 30)
.set_label_area_size(LabelAreaPosition::Right, 30)
.set_label_area_size(LabelAreaPosition::Top, 30)
.build_cartesian_2d(0.0..10.0, -1.0..1.0)
.unwrap();
upper_chart.configure_mesh().draw().unwrap();
upper_chart.draw_series(LineSeries::new(
(0..100).map(|x| x as f64 / 10.0).map(|x| (x, x.sin())),
&BLACK,
)).unwrap();
let mut lower_chart = ChartBuilder::on(&lower)
.set_label_area_size(LabelAreaPosition::Left, 30)
.set_label_area_size(LabelAreaPosition::Right, 30)
.build_cartesian_2d(0.0..10.0, -1.0..1.0)
.unwrap();
lower_chart.configure_mesh().draw().unwrap();
lower_chart.draw_series(
(0..100)
.map(|x| x as f64 / 10.0)
.map(|x| {
let color = if x.cos() > 0.0 { RED.mix(0.3).filled() } else {GREEN.mix(0.3).filled()};
Rectangle::new([(x, 0.0), (x + 0.1, x.cos())], color)
})
).unwrap();
}