У меня есть следующая проблема:
Я пытаюсь построить график plotly.scatter в сочетании с тире, который можно изменить с помощью ползунков с помощью обратного вызова. Я просмотрел документацию по dash и plotly и нашел несколько примеров для базовых и расширенных обратных вызовов, а также для ползунков.
https://dash.plotly.com/basic-обратные вызовы
https://dash.plotly.com/advanced-обратные вызовы
https://dash.plotly.com/dash-core-components/slider
Ползунки работают, и отображаемые данные также меняются, но старый график не исчезает, даже если я перезагружу страницу. Я не знаю, проблема в компоненте html или в обратном вызове.
from math import cos,sin,radians
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
from dash import Dash, dcc, html, Input, Output, callback
import pandas as pd
Я пропускаю вычисление, которое не вызывается в обратном вызове, потому что я совершенно уверен, что проблема не в этом, но если вы хотите, я также могу предоставить его.
def s_out(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar):
for a in np.linspace(0,360,3600):
s1i=cos(radians(a))
s2i=sin(radians(a))
fe=fE_tsaiwu((s1i,s2i,0,0,0,0),getm(XTvar, YTvar, ZTvar, XCvar, YCvar,ZCvar))
s1.append(s1i/fe)
s2.append(s2i/fe)
return s1, s2
s1, s2 = s_out(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar)
Компонент HTML с обратным вызовом:
(Я понял, что инициализация фигуры в Div даже не требуется)
app = Dash(__name__)
app.layout = html.Div([
dcc.Graph(
id='Tsai',
# figure=fig
figure = {}
),
html.H3(children='XTvar'),
html.H5(children='Der Wert des Sliders wird hier direkt unter dem momentanen Punkt angezeigt'),
dcc.Slider(
id= "XTvar",
min = 1,
max = 1500,
value = 1000,
tooltip = {"placement": "bottom", "always_visible": True}
),
html.H3(children='YTvar'),
dcc.Slider(
id= "YTvar",
min = 1,
max = 50,
value = 40,
),
html.H3(children='ZTvar'),
dcc.Slider(
id= "ZTvar",
min = 1,
max = 50,
value = 40,
),
html.H3(children='XCvar'),
dcc.Slider(
id= "XCvar",
min = 500,
max = 1000,
value = 700,
),
html.H3(children='YCvar'),
dcc.Slider(
id= "YCvar",
min = 100,
max = 150,
value = 120,
),
html.H3(children='ZCvar'),
dcc.Slider(
id= "ZCvar",
min = 100,
max = 150,
value = 120,
)
])
@app.callback(
Output(component_id='Tsai', component_property='figure'),
Input(component_id='XTvar', component_property='value'),
Input(component_id='YTvar', component_property='value'),
Input(component_id='ZTvar', component_property='value'),
Input(component_id='XCvar', component_property='value'),
Input(component_id='YCvar', component_property='value'),
Input(component_id='ZCvar', component_property='value')
)
def updatefigure(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar):
df = zip(s_out(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar))
fig = px.scatter(df,s1, s2)
return fig
if __name__ == '__main__':
app.run_server(debug=True)
Здесь вы можете увидеть, что происходит, если я передвигаю один из ползунков.
Я ценю любую помощь и надеюсь, что проблема хорошо описана.
Ваша логика в обратном вызове тире неполна.
Если вы посмотрите на s1, s2
после того, как вы переместите ползунок, вы обнаружите, что их длина увеличивается на 3600 каждый раз, когда вы перемещаете ползунок, поскольку вы никогда не очищаете s1, s2
после каждого вызова обратного вызова.
Поэтому каждый раз, когда вы перемещаете ползунок, вы рисуете новое затмение, добавляя новые значения к s1, s2
!
Вот несколько советов для вашего кода, чтобы избежать такого поведения.
Избегайте определения глобальных переменных, таких как s1, s2 = s_out(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar)
, в вашем коде. Глобальные переменные — это кэш в вашем приложении Dash, и их значение сохраняется до тех пор, пока вы не завершите сеанс отладки. У нас мало контроля над ними в Dash. Подробнее см. в Документация по тире.
Если вам нужно кэшировать некоторые значения между обратными вызовами, используйте dcc.Store
Используйте встроенный отладчик Dash, чтобы увидеть, что находится внутри обратных вызовов. Может быть полезно отслеживать более сложные обратные вызовы.