Da sh: реализация обратного вызова подсветки трассировки - PullRequest
0 голосов
/ 30 марта 2020

У меня есть базовое c da sh приложение со следующим файлом app.py:

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objects as go

def generate_plot():
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=[1, 2, 3], y=[1, 2, 3], name="A", line={"width": 1}))
    fig.add_trace(go.Scatter(x=[1, 2, 3], y=[1, 3, 5], name="B", line={"width": 1}))
    return fig

app = dash.Dash(__name__)
app.layout = html.Div(children=[
    html.H1(children="title", className="title"),
    dcc.Graph(figure=generate_plot(), className="plot")
])

Я хотел бы выделить (увеличить ширину линии до 5) след при наведении курсора. До сих пор я нашел способ добиться этого в блокноте Jupyter, используя объект go.FigureWidget вместо go.Figure (см. эту ссылку для получения дополнительной информации), однако, он не работает в Da sh. Если у кого-то есть идеи о том, как добиться желаемого эффекта, сообщите нам об этом.

Большое спасибо.

1 Ответ

0 голосов
/ 31 марта 2020

Думаю, мне удалось решить половину проблемы.

Во-первых, если вы используете метод для создания фигуры, вам нужно сохранить ее в отдельный объект:

my_plot = generate_plot()

Во-вторых, вам нужно дать своей фигуре ID:

dcc.Graph(figure=my_plot, id="my_plot")

В-третьих, вам нужно добавить app.callback, например:

@app.callback(
    dash.dependencies.Output("my_plot", "figure"),
    [dash.dependencies.Input("my_plot", "hoverData")]
)
def highlight_trace(hover_data):
    # here you set the default settings
    for trace in my_pot.data:
        country["line"]["width"] = 1
        country["opacity"] = 0.5
    if hover_data:
        trace_index = hover_data["points"][0]["curveNumber"]
        my_plot.data[trace_index]["line"]["width"] = 5
        my_plot.data[trace_index]["opacity"] = 1
    return my_plot

Это выделит след на hover, но он будет сбрасывать свое состояние только при наведении курсора на другую трассу (что может быть предполагаемым поведением в некоторых случаях). Я до сих пор не выяснил, как сбросить внешний вид трассы, как только вы не наводите курсор мыши на нее, , поэтому, если у вас есть какие-либо предложения по этому поводу, пожалуйста, сообщите нам об этом, пока я не буду считать этот вопрос без ответа

РЕДАКТИРОВАТЬ

Хорошо, я понял, как сбросить эффекты при наведении: просто добавьте параметр clear_on_hover, например: dcc.Graph(figure=my_plot, id="my_plot", clear_on_hover=True)

Большое спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...