Skip to content

Commit da729c0

Browse files
committed
Add toggle for 3D scatter plot marker size variation
Introduces a new callback to handle toggling marker size variation in the 3D scatter plot based on the 'size-vary-switch' state. Updates client-side logic to check for non-empty size variation state and standardizes marker size offset calculation. Refactors related callbacks to remove redundant 'size_vary' state and ensure consistent behavior.
1 parent 61af87f commit da729c0

File tree

3 files changed

+54
-10
lines changed

3 files changed

+54
-10
lines changed

app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def get_data_by_index(session: str, start_index: str) -> Response:
174174
Input("slider-frame", "value"),
175175
Input("stop-button", "n_clicks"),
176176
Input("decay-slider", "value"),
177-
Input("size-vary-switch", "value"),
177+
State("size-vary-switch", "value"),
178178
State("session-id", "data"),
179179
State("interval-component", "disabled"),
180180
State("colormap-3d", "value"),

assets/client_side.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -203,17 +203,17 @@ window.dash_clientside = Object.assign({}, window.dash_clientside, {
203203
}
204204

205205
// Add size offset to data.fig: offset = length - 1 - i
206-
if (data.data && data.data.fig && enable_size_vary) {
206+
if (data.data && data.data.fig && enable_size_vary && enable_size_vary.length > 0) {
207207
data.data.fig.forEach((trace, idx) => {
208208
if (trace?.marker?.size) {
209209
const figLength = data.data.fig.length;
210210
const offset = figLength - 1 - idx;
211211
if (Array.isArray(trace.marker.size)) {
212212
trace.marker.size = trace.marker.size.map(
213-
(size) => size + offset
213+
(size) => 3 + offset
214214
);
215215
} else {
216-
trace.marker.size += offset;
216+
trace.marker.size = 3 + offset;
217217
}
218218
}
219219
});
@@ -228,17 +228,17 @@ window.dash_clientside = Object.assign({}, window.dash_clientside, {
228228
try {
229229
const prevData = await getDataWithRetry(prevIndex);
230230
if (prevData) {
231-
if (prevData.data && prevData.data.fig && enable_size_vary) {
231+
if (prevData.data && prevData.data.fig && enable_size_vary && enable_size_vary.length > 0) {
232232
prevData.data.fig.forEach((trace, idx) => {
233233
if (trace?.marker?.size) {
234234
const figLength = prevData.data.fig.length;
235235
const offset = figLength - 1 - idx;
236236
if (Array.isArray(trace.marker.size)) {
237237
trace.marker.size = trace.marker.size.map(
238-
(size) => size + offset
238+
(size) => 3 + offset
239239
);
240240
} else {
241-
trace.marker.size += offset;
241+
trace.marker.size = 3 + offset;
242242
}
243243
}
244244
});

view_callbacks/scatter_3d_view.py

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,52 @@ def darkmode_change_callback(darkmode: list, fig: dict) -> dict:
277277

278278
return {"scatter3d": fig}
279279

280+
@app.callback(
281+
output={
282+
"scatter3d": Output("scatter3d", "figure", allow_duplicate=True),
283+
},
284+
inputs={
285+
"size_vary": Input("size-vary-switch", "value"),
286+
},
287+
state={
288+
"fig": State("scatter3d", "figure"),
289+
"session_id": State("session-id", "data"),
290+
"c_key": State("c-picker-3d", "value"),
291+
},
292+
prevent_initial_call=True,
293+
)
294+
def size_vary_callback(size_vary: list, fig: dict, session_id: str, c_key: str) -> dict:
295+
"""
296+
Toggle size variation for the 3D scatter plot.
297+
298+
Args:
299+
size_vary (list): Size variation enable state
300+
fig (dict): Current figure dictionary
301+
302+
Returns:
303+
dict: Updated figure with new theme
304+
"""
305+
306+
config = cache_get(session_id, CACHE_KEYS["config"])
307+
keys_dict = config["keys"]
308+
309+
ctype = keys_dict[c_key].get("type", KEY_TYPES["NUM"])
310+
311+
if config.get("x_ref", None) is not None and config.get("y_ref", None) is not None:
312+
data_length = len(fig["data"]) - 1
313+
else:
314+
data_length = len(fig["data"])
315+
316+
if size_vary and ctype == KEY_TYPES["CAT"]:
317+
for i in range(0, data_length):
318+
size_offset = data_length - 1 - i
319+
fig["data"][i]["marker"]["size"] = 3 + size_offset
320+
else:
321+
for i in range(0, data_length):
322+
fig["data"][i]["marker"]["size"] = 3
323+
324+
return {"scatter3d": fig}
325+
280326
@app.callback(
281327
output={
282328
"trigger": Output("visible-table-change-trigger", "data"),
@@ -502,7 +548,6 @@ def regenerate_figure_callback(
502548
"num_values": State({"type": "filter-slider", "index": ALL}, "value"),
503549
"visible_list": State("visible-picker", "value"),
504550
"c_key": State("c-picker-3d", "value"),
505-
"size_vary": State("size-vary-switch", "value"),
506551
"session_id": State("session-id", "data"),
507552
"file": State("current-file", "data"),
508553
"file_list": State("file-add", "value"),
@@ -522,7 +567,6 @@ def regenerate_figure_background_callback(
522567
num_values: list,
523568
visible_list: list,
524569
c_key: str,
525-
size_vary: str,
526570
session_id: str,
527571
file: str,
528572
file_list: list,
@@ -581,7 +625,7 @@ def regenerate_figure_background_callback(
581625
config,
582626
frame_list,
583627
c_key,
584-
bool(size_vary),
628+
False,
585629
num_keys,
586630
num_values,
587631
)

0 commit comments

Comments
 (0)