Skip to content

Commit 6f302cb

Browse files
committed
Add option to vary dot size by category in 3D scatter
Introduces a new checklist switch in the 3D view filter sidebar to enable or disable dot size variation by categories. Updates callbacks, processing, and visualization logic to pass and respect the new 'size_vary' parameter, allowing users to control whether dot sizes reflect category grouping in scatter plots.
1 parent a82d6bf commit 6f302cb

File tree

5 files changed

+45
-3
lines changed

5 files changed

+45
-3
lines changed

layouts/view3d_card_layout.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,22 @@ def get_filter_sidebar():
535535
target="click-hide-switch",
536536
placement="top",
537537
),
538+
dbc.Checklist(
539+
options=[
540+
{
541+
"label": "Dot size varies with categories",
542+
"value": True,
543+
}
544+
],
545+
value=[],
546+
id="size-vary-switch",
547+
switch=True,
548+
),
549+
dbc.Tooltip(
550+
"When this is enabled, the dot size varies with categories",
551+
target="size-vary-switch",
552+
placement="top",
553+
),
538554
dbc.Label("Decay"),
539555
dcc.Slider(
540556
id="decay-slider",

process_frame.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def process_single_frame(
7474
colormap: str,
7575
visible_list: List[str],
7676
c_key: str,
77+
size_vary: str,
7778
decay: int,
7879
session_id: str,
7980
file: str,
@@ -120,6 +121,7 @@ def process_single_frame(
120121
config,
121122
frame_list,
122123
c_key,
124+
bool(size_vary),
123125
num_keys,
124126
num_values,
125127
frame_idx,
@@ -227,6 +229,7 @@ def process_overlay_frame(
227229
colormap: str,
228230
visible_list: List[str],
229231
c_key: str,
232+
size_vary: str,
230233
session_id: str,
231234
file: str,
232235
file_list: List[str],
@@ -266,6 +269,7 @@ def process_overlay_frame(
266269
config,
267270
frame_list,
268271
c_key,
272+
bool(size_vary),
269273
num_keys,
270274
num_values,
271275
frame_idx,

utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ def prepare_figure_kwargs(
150150
config: Dict[str, Any],
151151
frame_list: List[float],
152152
c_key: str,
153+
size_vary: bool,
153154
num_keys: List[str],
154155
num_values: List[Tuple[float, float]],
155156
slider_arg: int = 0,
@@ -280,6 +281,7 @@ def prepare_figure_kwargs(
280281
)
281282

282283
fig_kwargs["c_type"] = keys_dict[c_key].get("type", KEY_TYPES["NUM"])
284+
fig_kwargs["size_vary"] = size_vary
283285
fig_kwargs["ref_name"] = "Host Vehicle"
284286

285287
return fig_kwargs

view_callbacks/scatter_3d_view.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ def toggle_3d_config_collapse(n_clicks: int, is_open: bool) -> dict:
133133
"colormap": State("colormap-3d", "value"),
134134
"visible_list": State("visible-picker", "value"),
135135
"c_key": State("c-picker-3d", "value"),
136+
"size_vary": State("size-vary-switch", "value"),
136137
"darkmode": State("darkmode-switch", "value"),
137138
"session_id": State("session-id", "data"),
138139
"file": State("current-file", "data"),
@@ -149,6 +150,7 @@ def slider_change_callback(
149150
colormap: str,
150151
visible_list: list,
151152
c_key: str,
153+
size_vary: str,
152154
overlay_enable: list,
153155
decay: int,
154156
darkmode: list,
@@ -189,6 +191,7 @@ def slider_change_callback(
189191
colormap,
190192
visible_list,
191193
c_key,
194+
bool(size_vary),
192195
session_id,
193196
file,
194197
file_list,
@@ -201,6 +204,7 @@ def slider_change_callback(
201204
colormap,
202205
visible_list,
203206
c_key,
207+
bool(size_vary),
204208
decay,
205209
session_id,
206210
file,
@@ -335,6 +339,7 @@ def visible_table_change_callback(
335339
"visible_list": Input("visible-picker", "value"),
336340
"unused_vistable_trigger": Input("visible-table-change-trigger", "data"),
337341
"c_key": Input("c-picker-3d", "value"),
342+
"size_vary": Input("size-vary-switch", "value"),
338343
"unused_left_hide_trigger": Input("left-hide-trigger", "data"),
339344
"unused_right_hide_trigger": Input("right-hide-trigger", "data"),
340345
"unused_file_loaded": Input("file-loaded-trigger", "data"),
@@ -370,6 +375,7 @@ def regenerate_figure_callback(
370375
ispaused: bool,
371376
slider_arg: int,
372377
c_key: str,
378+
size_vary: str,
373379
overlay_enable: list,
374380
unused_left_hide_trigger: int,
375381
unused_right_hide_trigger: int,
@@ -455,6 +461,7 @@ def regenerate_figure_callback(
455461
colormap,
456462
visible_list,
457463
c_key,
464+
bool(size_vary),
458465
session_id,
459466
file,
460467
file_list,
@@ -467,6 +474,7 @@ def regenerate_figure_callback(
467474
colormap,
468475
visible_list,
469476
c_key,
477+
bool(size_vary),
470478
decay,
471479
session_id,
472480
file,
@@ -494,6 +502,7 @@ def regenerate_figure_callback(
494502
"num_values": State({"type": "filter-slider", "index": ALL}, "value"),
495503
"visible_list": State("visible-picker", "value"),
496504
"c_key": State("c-picker-3d", "value"),
505+
"size_vary": State("size-vary-switch", "value"),
497506
"session_id": State("session-id", "data"),
498507
"file": State("current-file", "data"),
499508
"file_list": State("file-add", "value"),
@@ -513,6 +522,7 @@ def regenerate_figure_background_callback(
513522
num_values: list,
514523
visible_list: list,
515524
c_key: str,
525+
size_vary: str,
516526
session_id: str,
517527
file: str,
518528
file_list: list,
@@ -571,6 +581,7 @@ def regenerate_figure_background_callback(
571581
config,
572582
frame_list,
573583
c_key,
584+
bool(size_vary),
574585
num_keys,
575586
num_values,
576587
)
@@ -605,7 +616,6 @@ def regenerate_figure_background_callback(
605616
visible_list,
606617
)
607618

608-
# fig = get_scatter3d_data(filterd_frame, **fig_kwargs)
609619
result = get_scatter3d_data(filterd_frame, hover=keys_dict, **fig_kwargs)
610620
fig = result["scatter_data"]
611621
hover_strings = result["hover_strings"]
@@ -703,6 +713,7 @@ def invoke_filter_trigger(
703713
"case": State("test-case", "value"),
704714
"session_id": State("session-id", "data"),
705715
"c_key": State("c-picker-3d", "value"),
716+
"size_vary": State("size-vary-switch", "value"),
706717
"colormap": State("colormap-3d", "value"),
707718
"visible_list": State("visible-picker", "value"),
708719
"file": State("current-file", "data"),
@@ -723,6 +734,7 @@ def export_3d_scatter_animation(
723734
case: str,
724735
session_id: str,
725736
c_key: str,
737+
size_vary: str,
726738
colormap: str,
727739
visible_list: list,
728740
file: str,
@@ -775,6 +787,7 @@ def export_3d_scatter_animation(
775787
config,
776788
frame_list,
777789
c_key,
790+
bool(size_vary),
778791
num_keys,
779792
num_values,
780793
)

viz/graph_data.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ def get_scatter3d_data(
164164
"line_width": 0,
165165
}
166166

167+
enable_size_vary = kwargs.get("size_vary", False)
168+
167169
def format_hover(series: pd.Series, config: Dict[str, Any]) -> pd.Series:
168170
"""
169171
Format series values for hover display according to configuration.
@@ -269,8 +271,13 @@ def create_scatter(
269271
num_groups = len(grouped)
270272
for i, (name, group) in enumerate(sorted(grouped)):
271273
hover_text = process_hover(group)
272-
size_offset = num_groups - 1 - i
273-
result["scatter_data"].append(create_scatter(group, str(name), size_offset=size_offset))
274+
if enable_size_vary:
275+
size_offset = num_groups - 1 - i
276+
else:
277+
size_offset = 0
278+
result["scatter_data"].append(
279+
create_scatter(group, str(name), size_offset=size_offset)
280+
)
274281
result["hover_strings"].append(hover_text.tolist())
275282

276283
return result

0 commit comments

Comments
 (0)