Skip to main content

ggplot_rs/facet/
wrap.rs

1use crate::render::Rect;
2
3use super::Panel;
4
5/// Compute panel layout for facet_wrap.
6pub fn compute_wrap_panels(
7    levels: &[String],
8    ncol: Option<usize>,
9    total_area: &Rect,
10    strip_height: f64,
11) -> Vec<Panel> {
12    let n = levels.len();
13    if n == 0 {
14        return vec![];
15    }
16
17    let ncol = ncol.unwrap_or_else(|| {
18        let sqrt = (n as f64).sqrt().ceil() as usize;
19        sqrt.max(1)
20    });
21    let nrow = n.div_ceil(ncol);
22
23    let panel_width = total_area.width / ncol as f64;
24    let panel_height = total_area.height / nrow as f64;
25
26    levels
27        .iter()
28        .enumerate()
29        .map(|(i, label)| {
30            let row = i / ncol;
31            let col = i % ncol;
32
33            Panel {
34                row,
35                col,
36                label: label.clone(),
37                row_label: None,
38                col_label: Some(label.clone()),
39                rect: Rect {
40                    x: total_area.x + col as f64 * panel_width,
41                    y: total_area.y + row as f64 * panel_height + strip_height,
42                    width: panel_width,
43                    height: panel_height - strip_height,
44                },
45            }
46        })
47        .collect()
48}