Рисунок plotly.scatter не сбрасывается при обновлении с обратным вызовом (тире Python)

У меня есть следующая проблема:

Я пытаюсь построить график 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)

Здесь вы можете увидеть, что происходит, если я передвигаю один из ползунков.

Рисунок plotly.scatter не сбрасывается при обновлении с обратным вызовом (тире Python)

Рисунок plotly.scatter не сбрасывается при обновлении с обратным вызовом (тире Python)

Я ценю любую помощь и надеюсь, что проблема хорошо описана.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша логика в обратном вызове тире неполна.

Если вы посмотрите на s1, s2 после того, как вы переместите ползунок, вы обнаружите, что их длина увеличивается на 3600 каждый раз, когда вы перемещаете ползунок, поскольку вы никогда не очищаете s1, s2 после каждого вызова обратного вызова.

Поэтому каждый раз, когда вы перемещаете ползунок, вы рисуете новое затмение, добавляя новые значения к s1, s2!

Вот несколько советов для вашего кода, чтобы избежать такого поведения.

  1. Избегайте определения глобальных переменных, таких как s1, s2 = s_out(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar), в вашем коде. Глобальные переменные — это кэш в вашем приложении Dash, и их значение сохраняется до тех пор, пока вы не завершите сеанс отладки. У нас мало контроля над ними в Dash. Подробнее см. в Документация по тире. Если вам нужно кэшировать некоторые значения между обратными вызовами, используйте dcc.Store

  2. Используйте встроенный отладчик Dash, чтобы увидеть, что находится внутри обратных вызовов. Может быть полезно отслеживать более сложные обратные вызовы.

Другие вопросы по теме