(
plots: Vec<(&dyn Plot, usize, usize, usize, usize)>,
rows: Option<usize>,
cols: Option<usize>,
title: Option<Text>,
h_gap: Option<f64>,
v_gap: Option<f64>,
dimensions: Op
| 44 | } |
| 45 | |
| 46 | pub(super) fn build_irregular( |
| 47 | plots: Vec<(&dyn Plot, usize, usize, usize, usize)>, |
| 48 | rows: Option<usize>, |
| 49 | cols: Option<usize>, |
| 50 | title: Option<Text>, |
| 51 | h_gap: Option<f64>, |
| 52 | v_gap: Option<f64>, |
| 53 | dimensions: Option<&Dimensions>, |
| 54 | ) -> SubplotGrid { |
| 55 | let rows = rows.unwrap_or(1); |
| 56 | let cols = cols.unwrap_or(1); |
| 57 | let h_gap = h_gap.unwrap_or(0.1); |
| 58 | let v_gap = v_gap.unwrap_or(0.1); |
| 59 | |
| 60 | validate_irregular_grid(&plots, rows, cols); |
| 61 | |
| 62 | let mut all_traces: Vec<Box<dyn Trace + 'static>> = Vec::new(); |
| 63 | let mut plot_configs: Vec<PlotConfig> = Vec::new(); |
| 64 | let mut legend_sources: Vec<Vec<JsonTrace>> = Vec::new(); |
| 65 | let mut per_plot_traces: Vec<Vec<Box<dyn Trace + 'static>>> = Vec::new(); |
| 66 | let mut scene_count = 0; |
| 67 | let mut polar_count = 0; |
| 68 | let mut mapbox_count = 0; |
| 69 | let mut geo_count = 0; |
| 70 | |
| 71 | for (plot, row, col, rowspan, colspan) in plots.iter() { |
| 72 | let (traces, layout_json) = convert_plot(*plot); |
| 73 | let plot_type = detect_plot_type(traces[0].as_ref()); |
| 74 | let plot_title = plot.ir_layout().title.clone(); |
| 75 | |
| 76 | let x_axis_json = layout_json.get("xaxis").cloned().unwrap_or(Value::Null); |
| 77 | let y_axis_json = layout_json.get("yaxis").cloned().unwrap_or(Value::Null); |
| 78 | |
| 79 | let x_title = plot |
| 80 | .ir_layout() |
| 81 | .x_title |
| 82 | .clone() |
| 83 | .or_else(|| extract_axis_title_from_annotations(&layout_json, true)); |
| 84 | |
| 85 | let y_title = plot |
| 86 | .ir_layout() |
| 87 | .y_title |
| 88 | .clone() |
| 89 | .or_else(|| extract_axis_title_from_annotations(&layout_json, false)); |
| 90 | |
| 91 | let x_axis_type = if plot_type == PlotType::Cartesian2D { |
| 92 | detect_axis_type_from_traces(&traces) |
| 93 | } else { |
| 94 | None |
| 95 | }; |
| 96 | let y_axis_type = None; |
| 97 | |
| 98 | let layout_fragment = match plot_type { |
| 99 | PlotType::Cartesian3D => layout_json.get("scene").cloned(), |
| 100 | PlotType::Polar => layout_json.get("polar").cloned(), |
| 101 | PlotType::Mapbox => layout_json.get("mapbox").cloned(), |
| 102 | PlotType::Geo => layout_json.get("geo").cloned(), |
| 103 | _ => None, |
no test coverage detected