将鼠标悬停在数据上并单击 dash 上 dash_table 中的数据

Pra*_*ham 6 python tooltip plotly-dash

我在仪表板上创建了 dash_table 。当我悬停鼠标时,我需要来自表格的悬停数据;当我单击表格中的任何单元格时,我需要单击数据。我使用以下代码来获取活动单元格索引。但我不知道如何使用它来获取数据表单元格值。

@app.callback(Output('click-data', 'children'),
    [Input('datatable', 'active_cell')])
def display_click_data(active_cell):
    return json.dumps(active_cell, indent=2)
Run Code Online (Sandbox Code Playgroud)

请指导如何使用仪表板中的工具提示参数。

Dav*_*vid 3

关于您的第一个问题(A)如何获取活动单元格的值,您可以将表数据传递给State回调,然后只需选择选定的行和列。

为了解决您的第二个问题(B)并使用所选单元格的工具提示(悬停尚未实现),官方文档中的示例效果很好。

请在下面找到一个最小的示例(dash-1.19.0、dash_table-4.11.2):

# import modules    
import json    
import pandas as pd    
import dash
import dash_html_components as html
from dash.dependencies import Input, Output, State
import dash_table

# prepare dash_table    
size = 5
df = pd.DataFrame([], index=range(size))
df['num'] = range(size)
df['char'] = list('abcdefghijk')[:size]    
tab = dash_table.DataTable(
    id='table',
    columns=[{"name": i, "id": i} for i in df.columns],
    data=df.to_dict('records'),
    tooltip_data=[
        {
            # (B) multiply cell value by 10 for demonstration purpose
            column: {'value': str(value*10), 'type': 'markdown'}
            for column, value in row.items()
        } for row in df.to_dict('records')
    ],
    tooltip_delay=0,
    tooltip_duration=None
)

# set layout    
app = dash.Dash('SimpleExample')     
app.layout = html.Div([
    tab,
    html.Div(id='click-data', style={'whiteSpace': 'pre-wrap'}),

])

# define callback        
@app.callback(
    Output('click-data', 'children'),
    [Input('table', 'active_cell')],
     # (A) pass table as data input to get current value from active cell "coordinates"
    [State('table', 'data')]
)
def display_click_data(active_cell, table_data):
    if active_cell:
        cell = json.dumps(active_cell, indent=2)    
        row = active_cell['row']
        col = active_cell['column_id']
        value = table_data[row][col]
        out = '%s\n%s' % (cell, value)
    else:
        out = 'no cell selected'
    return out
 
# run app    
if __name__ == '__main__':
    app.run_server(debug=True)
Run Code Online (Sandbox Code Playgroud)