Ich richte eine Plotly-Dash-Website ein, auf der ich Daten aus einigen Domänen zu verschiedenen Zeitpunkten anzeigen möchte. Daher habe ich einen Schieberegler, mit dem Sie entscheiden können, welche Daten zu welchem Zeitpunkt Sie sehen möchten. Das funktioniert schon. Außerdem möchte ich, dass wenn jemand auf einen Punkt klickt, zu jedem Zeitpunkt eine Linie zwischen allen Positionen dieser Domäne angezeigt wird.
Ich habe versucht, eine Aktualisierungsfunktion zu definieren, damit ich die Daten für den Trace mit der Zeile darin aktualisiere. Das Diagramm selbst sieht jedoch nach dem Update nicht anders aus.
# create underlying figure
fig = go.Figure()
for date in file.date.unique():
f = file.loc[file["date"] == date]
fig.add_trace(go.Scatter(x = f.x,
y = f.y,
mode="markers",
name = date,
hovertext = f.domains,
visible = False,
marker=dict(
color=['#a3a7e4'] * len(f.x),
size=[5] * len(f.x)
),
))
# trace of path
dom="xxx"
filt = file.loc[file["domains"] == dom]
x_ = filt.x
y_ = filt.y
fig.add_trace(go.Scatter(
x = x_,
y = y_,
hovertext= dom,
name='"'+ dom +'"' + " development path",
visible=True,
mode='lines'
))
# Create and add slider
steps = []
for i in range(len(fig.data)-1):
step = dict(
method="restyle",
args=["visible", [False] * len(fig.data)],
label=fig.data[i].name
)
step["args"][1][i] = True # Toggle i'th trace to "visible"
steps.append(step)
sliders = [dict(
active=10,
currentvalue={"prefix": "Date: "},
pad={"t": 50},
steps=steps
)]
# create widget from figure
f = go.FigureWidget(data=fig.data, layout=fig.layout)
# create our callback function
def update_point(trace, points, selector):
filter_2 = file[(file["x"] == points.xs[0]) & (file["y"] ==
points.ys[0])]
domain = filter_2.domains.values[0]
print(domain)
small_df = file[file["domains"] == domain]
fig.data[-1].hovertext = domain
fig.data[-1].name = '"' + domain + '"' + " development path"
fig.data[-1].x = small_df.x.values
fig.data[-1].y = small_df.y.values
fig.update_traces(visible=True, selector=dict(mode="line"))
f = go.FigureWidget(data=fig.data, layout=fig.layout)
f
for i in range(len(fig.data)-1):
if f.data[i].visible is True:
f.data[i].on_click(update_point)
f
Ich möchte nur, dass auch das Diagramm aktualisiert wird, nicht nur die zugrunde liegenden Daten.
Schauen Sie sich Dash-Rückrufe hier an:
https://dash.plot.ly/getting-started-part-2
Kurz gesagt, Sie müssen Ihren Rückrufen Dekoratoren hinzufügen, die angeben, welche Eingabe den Rückruf auslöst und welches Diagramm bei einem Rückruflauf aktualisiert werden muss. Sie können einen Rückruf nicht programmgesteuert auslösen und erwarten, dass er das Diagramm ändert. Der Rückruf muss meines Wissens von der Benutzeroberfläche kommen.
Z.B:
app.layout = html.Div([
dcc.Input(id='my-id', value='initial value', type='text'),
html.Div(id='my-div')
])
@app.callback(
Output(component_id='my-div', component_property='children'),
[Input(component_id='my-id', component_property='value')]
)
def update_output_div(input_value):
return 'You have entered "{}"'.format(input_value)
In diesem Beispiel wird erwartet, dass der Rückruf ausgelöst wird, wenn sich der Wert der Eingabe mit der ID "my-id" ändert, und im Gegenzug ändert sich der Wert des div. Die "Ausgabe" im Dekorator muss Ihr Diagramm sein, wenn Sie einen Rückruf benötigen, um ein Diagramm zu ändern.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen