Hot-key behaviour to remove traces from plot via legend

Here, try this instead:

from dash import ctx, Patch, no_update
from dash_extensions.enrich import dcc
from dash_extensions.enrich import DashProxy, html, Input, Output, State
from dash_extensions import EventListener
from dash.exceptions import PreventUpdate
import plotly.graph_objects as go

event = {"event": "click", "props": ['ctrlKey']}

kwargs = {
    "meta_tags": [
        {"name": "viewport", "content": "width=device-width, initial-scale=1, shrink-to-fit=no", "charset": "utf-8"}],
    "title": "Event Listener",
}

app = DashProxy(__name__, **kwargs)


def dummy_graph():
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=[1, 2, 3], y=[1, 2, 3], name=f'Trace 1'))
    fig.add_trace(go.Scatter(x=[4, 5, 6], y=[1, 2, 3], name=f'Trace 2'))
    fig.add_trace(go.Scatter(x=[7, 8, 9], y=[1, 2, 3], name=f'Trace 3'))
    return fig


app.layout = html.Div(
    [
        EventListener(
            events=[event], logging=True, id="el",
        ),
        dcc.Graph(
            id="graph",
            figure=dummy_graph()
        ),

        html.Div(id="output"),
        html.Div(id="log")
    ]
)


@app.callback(
    [Output("output", "children"),
     Output("graph", "figure")],
    [Input("graph", "restyleData"),
     State("el", "event")],
    prevent_initial_call=True
)
def display_relayout_data(relayout_data, e):
    triggered_input = ctx.triggered_id
    if triggered_input == "graph":
        print(e)
        if e is not None:
            if e['ctrlKey'] == True:
                new_fig = Patch()
                del new_fig['data'][relayout_data[1][0]]
                return "", new_fig
    raise PreventUpdate


if __name__ == "__main__":
    app.run_server(debug=True)

Click events also have ctrlKey. :wink:

1 Like