Skip to content

Commit 61af87f

Browse files
committed
Enable size variation in 3D scatter plot traces
Added support for varying marker sizes in 3D scatter plots based on a new 'size-vary-switch' input. Updated client-side JavaScript to adjust marker sizes dynamically and refactored callback input/state handling in Python to accommodate the new feature.
1 parent 8b6c4b1 commit 61af87f

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

app.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +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"),
177178
State("session-id", "data"),
178179
State("interval-component", "disabled"),
179180
State("colormap-3d", "value"),

assets/client_side.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ window.dash_clientside = Object.assign({}, window.dash_clientside, {
118118
slider_arg,
119119
stop_clicks,
120120
decay,
121+
enable_size_vary,
121122
session,
122123
ispaused,
123124
colormap,
@@ -201,6 +202,23 @@ window.dash_clientside = Object.assign({}, window.dash_clientside, {
201202
return [dash_clientside.no_update, remote_trigger + 1];
202203
}
203204

205+
// Add size offset to data.fig: offset = length - 1 - i
206+
if (data.data && data.data.fig && enable_size_vary) {
207+
data.data.fig.forEach((trace, idx) => {
208+
if (trace?.marker?.size) {
209+
const figLength = data.data.fig.length;
210+
const offset = figLength - 1 - idx;
211+
if (Array.isArray(trace.marker.size)) {
212+
trace.marker.size = trace.marker.size.map(
213+
(size) => size + offset
214+
);
215+
} else {
216+
trace.marker.size += offset;
217+
}
218+
}
219+
});
220+
}
221+
204222
let allData = [data];
205223
// Get previous figures if decay > 0
206224
if (decay > 0) {
@@ -210,6 +228,21 @@ window.dash_clientside = Object.assign({}, window.dash_clientside, {
210228
try {
211229
const prevData = await getDataWithRetry(prevIndex);
212230
if (prevData) {
231+
if (prevData.data && prevData.data.fig && enable_size_vary) {
232+
prevData.data.fig.forEach((trace, idx) => {
233+
if (trace?.marker?.size) {
234+
const figLength = prevData.data.fig.length;
235+
const offset = figLength - 1 - idx;
236+
if (Array.isArray(trace.marker.size)) {
237+
trace.marker.size = trace.marker.size.map(
238+
(size) => size + offset
239+
);
240+
} else {
241+
trace.marker.size += offset;
242+
}
243+
}
244+
});
245+
}
213246
allData.push(prevData);
214247
}
215248
} catch (error) {

view_callbacks/scatter_3d_view.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,6 @@ def visible_table_change_callback(
339339
"visible_list": Input("visible-picker", "value"),
340340
"unused_vistable_trigger": Input("visible-table-change-trigger", "data"),
341341
"c_key": Input("c-picker-3d", "value"),
342-
"size_vary": Input("size-vary-switch", "value"),
343342
"unused_left_hide_trigger": Input("left-hide-trigger", "data"),
344343
"unused_right_hide_trigger": Input("right-hide-trigger", "data"),
345344
"unused_file_loaded": Input("file-loaded-trigger", "data"),
@@ -353,6 +352,7 @@ def visible_table_change_callback(
353352
},
354353
state={
355354
"ispaused": State("interval-component", "disabled"),
355+
"size_vary": State("size-vary-switch", "value"),
356356
"slider_arg": State("slider-frame", "value"),
357357
"overlay_enable": State("overlay-switch", "value"),
358358
"decay": State("decay-slider", "value"),

0 commit comments

Comments
 (0)