Я пытаюсь добавить интерактивность к трехмерному графику рассеяния, который я размещаю, используя тире. Мой вопрос состоит из двух взаимосвязанных частей:
(i) Я бы хотел вручную выбрать точки в моем трехмерном разбросе и изменить цвет выбранных точек на красный. Выбор должен включать событие щелчка и событие выбора.
(ii) Я хотел бы иметь возможность удалять эти точки из графика при нажатии клавиши, например клавиши «удалить».
Part (i) аналогичен примеру из руководства по графику https://plot.ly/python/click-events/,, однако on_click недоступен в качестве метода для трехмерных точечных диаграмм.
Я пытался использовать FigureWidget, поскольку он, очевидно, предоставляет методы для захвата щелчков и выбора, но через 2 дня я пытаюсь добиться прогресса.
Пример данных (скопируйте ниже в буфер обмена и запуститеdf = pd.read_clipboard (sep = ','))
id,x_val,z_val,y_val
a,11.313449728149418,0.13039110880256777,0.5386387766748618
b,11.321463427315383,0.2360697833061771,1.32441455152796
c,10.127132005050942,0.23085014016641864,1.0961116175427044
d,11.639819269465233,0.0958798324712593,0.6506370305953094
e,8.892696370438149,0.08223988244819926,0.6440321391968353
f,6.711586646011124,0.3657515974938044,
g,7.095030650760687,,0.5723062047617504
h,6.4523124528415,,1.293852184258803
i,7.165105300812886,0.4151365420301895,-0.5920674079031845
j,7.480703395137295,0.14284429977557123,1.0600936940126982
k,5.570775744372319,,
l,4.358946555449826,,
У меня есть пример кода ниже, который, я надеюсь, уже почти (но не совсем). Идея состоит в том, что handle_click должен фиксировать события клика. Я должен также обрабатывать события «выделения», хотя я не уверен, как это сделать, поскольку трехмерный график рассеяния не предоставляет поле выбора или инструмент lassoo. С обратным вызовом я даже не уверен, как инициировать, так как нет события clickData / selectionData с трехмерной диаграммой рассеяния, которое я мог бы использовать (поэтому [Input('subindustry-dropdown', 'value')])
неверно, и обратите внимание, что раскрытие субиндустрии - это не то, что я предоставил впример, но я выбираю свои идентификаторы из выпадающего списка, который возвращает значение subindustry в моей версии разработки.)
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import pandas as pd
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.css.append_css({
"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"
})
app.layout = html.Div([html.Div(id = '3d-scatter'),
])
# Calculate and store data
@app.callback(Output('3d-scatter', 'children'),
[Input('subindustry-dropdown', 'value')])
def chart_3d():
f = go.FigureWidget(px.scatter_3d(df, x = 'x_val', y = 'y_val', z = 'z_val', hover_name = 'company_nm'))
f.layout.clickmode = 'event+select'
f.data[0].on_click(handle_click) # if click, then update point/df.
return dcc.Graph(id = '3d_scat', figure=f)
def handle_click(trace, points, selector):
c = list(f.data[0].marker.color)
s = list(f.data[0].marker.size)
for i in points.point_inds:
c[i] = '#bae2be'
s[i] = 20
with f.batch_update():
f.data[0].marker.color = c
f.data[0].marker.size = s
return f.data[0]