plotly.scatter 使用回调更新时图形不会重置(python 破折号)
plotly.scatter figure doesnt reset when updating with callback (python dash)
我有以下问题:
我尝试绘制一个 plotly.scatter 结合破折号的绘图,它应该可以通过使用回调的滑块进行更改。
我搜索了 dash 和 plotly 的文档,找到了一些基本和高级回调以及 Sliders
的示例
https://dash.plotly.com/basic-callbacks
https://dash.plotly.com/advanced-callbacks
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)
在这里你可以看到如果我移动其中一个滑块会发生什么。
感谢各种帮助,我希望问题得到很好的描述。
您在 dash 回调中的逻辑不完整。
如果您在移动滑块后查看 s1, s2
,您会发现每次移动滑块时它们的长度都会增加 3600,因为每次调用后您都不会清除 s1, s2
到回调。
因此,每次移动滑块时,都会通过向 s1, s2
添加新值来绘制新的日食!
这里有一些针对您的代码的建议,以避免这种行为。
避免在代码中定义全局变量,如 s1, s2 = s_out(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar)
。全局变量是 Dash 应用程序中的缓存,它的值一直存在,直到您终止调试会话。我们在 Dash 中几乎无法控制它们。有关详细信息,请参阅 Dash Documentation。
如果您需要在回调之间缓存一些值,请使用 dcc.Store
使用 Dash built-in 调试器查看回调中的内容。跟踪更复杂的回调可能很有用。
我有以下问题:
我尝试绘制一个 plotly.scatter 结合破折号的绘图,它应该可以通过使用回调的滑块进行更改。 我搜索了 dash 和 plotly 的文档,找到了一些基本和高级回调以及 Sliders
的示例https://dash.plotly.com/basic-callbacks
https://dash.plotly.com/advanced-callbacks
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)
在这里你可以看到如果我移动其中一个滑块会发生什么。
感谢各种帮助,我希望问题得到很好的描述。
您在 dash 回调中的逻辑不完整。
如果您在移动滑块后查看 s1, s2
,您会发现每次移动滑块时它们的长度都会增加 3600,因为每次调用后您都不会清除 s1, s2
到回调。
因此,每次移动滑块时,都会通过向 s1, s2
添加新值来绘制新的日食!
这里有一些针对您的代码的建议,以避免这种行为。
避免在代码中定义全局变量,如
s1, s2 = s_out(XTvar, YTvar, ZTvar, XCvar, YCvar, ZCvar)
。全局变量是 Dash 应用程序中的缓存,它的值一直存在,直到您终止调试会话。我们在 Dash 中几乎无法控制它们。有关详细信息,请参阅 Dash Documentation。 如果您需要在回调之间缓存一些值,请使用 dcc.Store使用 Dash built-in 调试器查看回调中的内容。跟踪更复杂的回调可能很有用。