|
4 | 4 | from collections import abc |
5 | 5 | from collections.abc import Sequence |
6 | 6 | from copy import copy |
7 | | -from typing import Any |
| 7 | +from typing import Any, Literal |
8 | 8 |
|
9 | 9 | import dask |
10 | 10 | import dask.dataframe as dd |
|
80 | 80 | _Normalize = Normalize | abc.Sequence[Normalize] |
81 | 81 |
|
82 | 82 |
|
| 83 | +def _get_top_data_array(element: xr.DataArray | DataTree) -> xr.DataArray: |
| 84 | + if isinstance(element, DataTree): |
| 85 | + return next(iter(next(iter(element.values())).data_vars.values())) |
| 86 | + return element |
| 87 | + |
| 88 | + |
| 89 | +def _guard_2d_only(element: xr.DataArray | DataTree, element_name: str, kind: Literal["images", "labels"]) -> None: |
| 90 | + top = _get_top_data_array(element) |
| 91 | + if "z" in top.dims: |
| 92 | + z_size = top.sizes["z"] |
| 93 | + raise ValueError( |
| 94 | + f"render_{kind} does not support 3D {kind}. Element '{element_name}' has a 'z' dimension " |
| 95 | + f"with {z_size} slices. Select a 2D slice before plotting:\n" |
| 96 | + f" sdata['{element_name}'].isel(z=0)\n" |
| 97 | + "or use sd.bounding_box_query() to extract a 2D region." |
| 98 | + ) |
| 99 | + |
| 100 | + |
83 | 101 | def _want_decorations(color_vector: Any, na_color: Color) -> bool: |
84 | 102 | """Return whether legend/colorbar decorations should be shown. |
85 | 103 |
|
@@ -1247,6 +1265,7 @@ def _render_images( |
1247 | 1265 |
|
1248 | 1266 | palette = render_params.palette |
1249 | 1267 | img = sdata_filt[render_params.element] |
| 1268 | + _guard_2d_only(img, render_params.element, "images") |
1250 | 1269 | extent = get_extent(img, coordinate_system=coordinate_system) |
1251 | 1270 | scale = render_params.scale |
1252 | 1271 |
|
@@ -1674,6 +1693,7 @@ def _render_labels( |
1674 | 1693 | ) |
1675 | 1694 |
|
1676 | 1695 | label = sdata_filt.labels[element] |
| 1696 | + _guard_2d_only(label, element, "labels") |
1677 | 1697 | extent = get_extent(label, coordinate_system=coordinate_system) |
1678 | 1698 |
|
1679 | 1699 | # get best scale out of multiscale label |
|
0 commit comments