9494# once https://github.com/scverse/spatialdata/pull/689/ is in a release
9595ColorLike = tuple [float , ...] | list [float ] | str
9696
97+ _GROUPS_IGNORED_WARNING = "Parameter 'groups' is ignored when 'color' is a literal color, not a column name."
98+
99+
100+ def _gate_palette_and_groups (
101+ element_params : dict [str , Any ],
102+ param_dict : dict [str , Any ],
103+ ) -> None :
104+ """Set palette/groups on element_params only when col_for_color is present, else warn."""
105+ has_col = element_params .get ("col_for_color" ) is not None
106+ element_params ["palette" ] = param_dict ["palette" ] if has_col else None
107+ if not has_col and param_dict ["groups" ] is not None :
108+ logger .warning (_GROUPS_IGNORED_WARNING )
109+ element_params ["groups" ] = param_dict ["groups" ] if has_col else None
110+
97111
98112def _extract_scalar_value (value : Any , default : float = 0.0 ) -> float :
99113 """
@@ -981,7 +995,7 @@ def _set_color_source_vec(
981995 alpha : float = 1.0 ,
982996 table_name : str | None = None ,
983997 table_layer : str | None = None ,
984- render_type : Literal ["points" ] | None = None ,
998+ render_type : Literal ["points" , "labels" ] | None = None ,
985999 coordinate_system : str | None = None ,
9861000) -> tuple [ArrayLike | pd .Series | None , ArrayLike , bool ]:
9871001 if value_to_plot is None and element is not None :
@@ -1454,7 +1468,7 @@ def _get_categorical_color_mapping(
14541468 alpha : float = 1 ,
14551469 groups : list [str ] | str | None = None ,
14561470 palette : list [str ] | str | None = None ,
1457- render_type : Literal ["points" ] | None = None ,
1471+ render_type : Literal ["points" , "labels" ] | None = None ,
14581472) -> Mapping [str , str ]:
14591473 if not isinstance (color_source_vector , Categorical ):
14601474 raise TypeError (f"Expected `categories` to be a `Categorical`, but got { type (color_source_vector ).__name__ } " )
@@ -2145,15 +2159,15 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st
21452159 }:
21462160 if not isinstance (color , str | tuple | list ):
21472161 raise TypeError ("Parameter 'color' must be a string or a tuple/list of floats." )
2148- if element_type in {"shapes" , "points" }:
2162+ if element_type in {"shapes" , "points" , "labels" }:
21492163 if _is_color_like (color ):
21502164 logger .info ("Value for parameter 'color' appears to be a color, using it as such." )
21512165 param_dict ["col_for_color" ] = None
21522166 param_dict ["color" ] = Color (color )
21532167 if param_dict ["color" ].alpha_is_user_defined ():
21542168 if element_type == "points" and param_dict .get ("alpha" ) is None :
21552169 param_dict ["alpha" ] = param_dict ["color" ].get_alpha_as_float ()
2156- elif element_type == "shapes" and param_dict .get ("fill_alpha" ) is None :
2170+ elif element_type in { "shapes" , "labels" } and param_dict .get ("fill_alpha" ) is None :
21572171 param_dict ["fill_alpha" ] = param_dict ["color" ].get_alpha_as_float ()
21582172 else :
21592173 logger .info (
@@ -2165,7 +2179,7 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st
21652179 param_dict ["color" ] = None
21662180 else :
21672181 raise ValueError (f"{ color } is not a valid RGB(A) array and therefore can't be used as 'color' value." )
2168- elif "color" in param_dict and element_type != "labels " :
2182+ elif "color" in param_dict and element_type != "images " :
21692183 param_dict ["col_for_color" ] = None
21702184
21712185 outline_width = param_dict .get ("outline_width" )
@@ -2256,6 +2270,9 @@ def _type_check_params(param_dict: dict[str, Any], element_type: str) -> dict[st
22562270 elif element_type == "shapes" :
22572271 # set default fill_alpha for shapes if not given by user explicitly or implicitly (as part of color)
22582272 param_dict ["fill_alpha" ] = 1.0
2273+ elif element_type == "labels" :
2274+ # set default fill_alpha for labels if not given by user explicitly or implicitly (as part of color)
2275+ param_dict ["fill_alpha" ] = 0.4
22592276
22602277 cmap = param_dict .get ("cmap" )
22612278 palette = param_dict .get ("palette" )
@@ -2412,8 +2429,8 @@ def _validate_label_render_params(
24122429 sdata : sd .SpatialData ,
24132430 element : str | None ,
24142431 cmap : list [Colormap | str ] | Colormap | str | None ,
2415- color : str | None ,
2416- fill_alpha : float | int ,
2432+ color : ColorLike | None ,
2433+ fill_alpha : float | int | None ,
24172434 contour_px : int | None ,
24182435 groups : list [str ] | str | None ,
24192436 palette : list [str ] | str | None ,
@@ -2462,15 +2479,16 @@ def _validate_label_render_params(
24622479 element_params [el ]["table_layer" ] = param_dict ["table_layer" ]
24632480
24642481 element_params [el ]["table_name" ] = None
2465- element_params [el ]["color" ] = None
2466- color = param_dict ["color" ]
2467- if color is not None :
2468- color , table_name = _validate_col_for_column_table (sdata , el , color , param_dict ["table_name" ], labels = True )
2482+ element_params [el ]["color" ] = param_dict ["color" ] # literal Color or None
2483+ element_params [el ]["col_for_color" ] = None
2484+ if (col_for_color := param_dict ["col_for_color" ]) is not None :
2485+ col_for_color , table_name = _validate_col_for_column_table (
2486+ sdata , el , col_for_color , param_dict ["table_name" ], labels = True
2487+ )
24692488 element_params [el ]["table_name" ] = table_name
2470- element_params [el ]["color " ] = color
2489+ element_params [el ]["col_for_color " ] = col_for_color
24712490
2472- element_params [el ]["palette" ] = param_dict ["palette" ] if element_params [el ]["table_name" ] is not None else None
2473- element_params [el ]["groups" ] = param_dict ["groups" ] if element_params [el ]["table_name" ] is not None else None
2491+ _gate_palette_and_groups (element_params [el ], param_dict )
24742492 element_params [el ]["colorbar" ] = param_dict ["colorbar" ]
24752493 element_params [el ]["colorbar_params" ] = param_dict ["colorbar_params" ]
24762494
@@ -2537,8 +2555,7 @@ def _validate_points_render_params(
25372555 element_params [el ]["table_name" ] = table_name
25382556 element_params [el ]["col_for_color" ] = col_for_color
25392557
2540- element_params [el ]["palette" ] = param_dict ["palette" ] if param_dict ["col_for_color" ] is not None else None
2541- element_params [el ]["groups" ] = param_dict ["groups" ] if param_dict ["col_for_color" ] is not None else None
2558+ _gate_palette_and_groups (element_params [el ], param_dict )
25422559 element_params [el ]["ds_reduction" ] = param_dict ["ds_reduction" ]
25432560 element_params [el ]["colorbar" ] = param_dict ["colorbar" ]
25442561 element_params [el ]["colorbar_params" ] = param_dict ["colorbar_params" ]
@@ -2621,8 +2638,7 @@ def _validate_shape_render_params(
26212638 element_params [el ]["table_name" ] = table_name
26222639 element_params [el ]["col_for_color" ] = col_for_color
26232640
2624- element_params [el ]["palette" ] = param_dict ["palette" ] if param_dict ["col_for_color" ] is not None else None
2625- element_params [el ]["groups" ] = param_dict ["groups" ] if param_dict ["col_for_color" ] is not None else None
2641+ _gate_palette_and_groups (element_params [el ], param_dict )
26262642 element_params [el ]["method" ] = param_dict ["method" ]
26272643 element_params [el ]["ds_reduction" ] = param_dict ["ds_reduction" ]
26282644 element_params [el ]["colorbar" ] = param_dict ["colorbar" ]
0 commit comments