Я пытаюсь создать интерактивный графический визуальный элемент, содержащий набор изображений и таблицу. Следующий код генерирует некоторые синтетические данные: X имеет 536 нормализованных тепловых карт размером 96x96, а y содержит целые числа от 0 до 9. Таким образом, 0 имеет 200 выборок, 1 — 10 выборок и так далее. Для каждого элемента в y существует тепловая карта размером 96x96 со значениями element/10.
из тире import Dash, dcc, html, ввод, вывод, обратный вызов из тире импорта Dash_table импортироватьplotly.express как px импортируйтеplotly.graph_objects как идти импортировать панд как pd импортировать numpy как np импорт математики образцы = [200,10,5,40,60,100,2,100,9,10] idx = [n для n в диапазоне (10)] для меня, SMP в zip (idx, образцы): если я == 0: X = np.full((smp,96, 96), я/10) y = np.full((smp,),i) еще: tempx = np.full((smp,96, 96), я/10) tempy = np.full((smp,),i) X = np.r_[X,tempx] y = np.r_[y,tempy]} Теперь, когда я создаю визуализацию, я получаю ожидаемое поведение. Когда я выбираю число из раскрывающегося списка, появляются соответствующие изображения вместе с фреймом данных, показывающим выбранную цифру и индекс образца. Я хочу добавить поведение, при котором при наведении курсора на изображение соответствующая строка в кадре данных должна подсвечиваться.
app = Dash(__name__) tbl_cols = ['Выбор','Образцы'] app.layout = html.Div([ dcc.Dropdown([i для i в диапазоне(10)], 0, идентификатор = 'my_dropdown'), html.Div([ html.Div([ dcc.Graph(id='my_picbox',style={'display':'inline-block'}) ],style={'width': '40%', 'display': 'inline-block'}), html.Div([ Dash_table.DataTable( идентификатор = 'таблица', columns = [{'name': i, 'id': i} для i в tbl_cols]), ],style={'width': '60%', 'display': 'inline-block'}) ],style={'display': 'flex'}) ]) @перезвонить( [Вывод(comComponent_id='my_picbox', компонент_свойство='фигура'), Вывод(comComponent_id='таблица', компонент_свойство='данные')], Ввод(comComponent_id='my_dropdown', компонент_свойство='значение') ) защита update_plot (цифра): если цифра не равна None: образцы = np.where(y==цифра)[0] если len(образцы)>20: образцы = np.random.choice(образцы,20) imgs = np.empty((20,96,96),) imgs[:]= np.nan imgs[0:len(образцы)]=X[образцы, :, :] fig = px.imshow(imgs[:, :, :], двоичная_строка = Ложь, zмин=0, zмакс=1, facet_col=0, аспект = 'авто', facet_col_wrap=5, facet_row_spacing = 0, color_continous_scale='rdylgn') для меня в fig.layout.annotations: n = int(i['text'].split('=')[1]) пытаться: я['текст']=str(образцы[n]) кроме: я['текст']=' ' fig.update_layout(margin = dict(t=70, l=50, r=0, b=5), #coloraxis_showscale = Ложь, высота = 600, ширина = 600,) df = pd.DataFrame(данные = {'Samples':samples}) df['Выбор'] = цифра данные = df[tbl_cols].to_dict('записи') вернуть рис, данные если __name__ == '__main__': app.run_server(debug=True, порт=8056)

Мобильная версия