如何在Dash应用中将绘图数据映射到网格上

1 投票
1 回答
37 浏览
提问于 2025-04-14 16:53

我有一个简单的一页式仪表板应用,里面有一个基于一些数据的 dash-ag-grid 表格,还有一个基于同样数据的 go.Scatter 图表(包含线和标记)。请告诉我如何设置映射,这样当我在图表上选择一个区域时,表格只显示该图表上选定时间戳的数据。

表格:

def create_grid(df):
    columnDefs=[{'headerName': col, 'field': col} for col in df.columns]
    ag_grid = dag.AgGrid(
        id="ag-grid",
        rowData=df.to_dict("records"),
        columnDefs=columnDefs,
    )
    return ag_grid

图表:

def plot(df, group_by, param, per=None):
    group_by = 'timestamp'
    fig = go.Figure()
    cum_sum = df.groupby(group_by)[param].sum().reset_index()
    
    fig.add_trace(go.Scatter(x=cum_sum[group_by],y=cum_sum[param],mode='lines',name=param,marker=dict(color=color)),) 
        
    for _, row in cum_sum.iterrows():
        group = row[group_by_label]
        fig.add_scatter(x=[group], y=[row[param]], mode='markers', name='', 
            showlegend=False,marker=dict(color=color),)  

    fig.update_layout(title='Title',xaxis=dict(type='category'),height=height,)
    return fig

应用:

app.layout = html.Div([
    html.Div([grid]),
    dcc.Graph(id='scatter',figure=fig1)])

1 个回答

0

在Dash中,你可以使用回调函数。

import dash
from dash import dcc, html, callback_context
import dash_ag_grid as dag
import pandas as pd
import plotly.graph_objs as go

# Sample DataFrame
df = pd.DataFrame({
    'timestamp': pd.date_range(start='2024-03-01', end='2024-03-10'),
    'value': range(10)
})

# Define your color and other constants
color = 'blue'
height = 500

# Function to create the grid
def create_grid(df):
    columnDefs = [{'headerName': col, 'field': col} for col in df.columns]
    ag_grid = dag.AgGrid(
        id="ag-grid",
        rowData=df.to_dict("records"),
        columnDefs=columnDefs,
    )
    return ag_grid

# Function to create the scatter plot
def plot(df, param):
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=df['timestamp'], y=df[param], mode='lines+markers', name=param, marker=dict(color=color)))
    fig.update_layout(title='Title', xaxis=dict(type='category'), height=height)
    return fig

# Initialize Dash app
app = dash.Dash(__name__)

# Define layout
app.layout = html.Div([
    html.Div(id='table-container', children=[create_grid(df)]),
    dcc.Graph(id='scatter', figure=plot(df, 'value'))
])

# Callback to update table data based on selected area in scatter plot
@app.callback(
    dash.dependencies.Output('ag-grid', 'rowData'),
    [dash.dependencies.Input('scatter', 'selectedData')]
)
def update_table(selected_data):
    if selected_data is None:
        # No area selected, return original data
        return df.to_dict("records")
    else:
        # Filter data based on selected area
        selected_points = selected_data['points']
        timestamps = [point['x'] for point in selected_points]
        filtered_df = df[df['timestamp'].isin(timestamps)]
        return filtered_df.to_dict("records")

# Run the app
if __name__ == '__main__':
    app.run_server(debug=True)

现在,当你在散点图上选择一个区域时,表格会更新,只显示你选择的时间点的数据。

撰写回答