【问题标题】:First update of plotly Dash with live update通过实时更新首次更新 plotly Dash
【发布时间】:2017-10-04 17:39:43
【问题描述】:

我正在尝试在 Python (3.x) 中使用带有 plotly Dash (0.18.3) 的实时更新,但我不需要如此频繁地更新绘图(我需要一天一两次)。

到目前为止,我做了以下事情:

import dash
import pandas as pd
import plotly.graph_objs as go
import dash.dependencies as ddp
import dash_core_components as dcc
import dash_html_components as html

def plot_figure(data):
    layout = dict(
    title="Figure w/ plotly",
    )

    fig = dict(data=data, layout=layout)
    return fig

def serve_layout():
    return html.Div(children=[
        html.Div([
            html.H1("Plotly test with Live update",
                    style={"font-family": "Helvetica",
                           "border-bottom": "1px #000000 solid"}),
            ], className='banner'),
        html.Div([dcc.Graph(id='plot')],),
        dcc.Interval(id='live-update', interval=interval),
],)

second = 1000
minute = 60
hour   = 60
day    = 24
interval = 1/2*day*hour*minute*second

app = dash.Dash()

app.layout = serve_layout

@app.callback(
    ddp.Output('plot', 'figure'),
    [],
    [],
    [ddp.Event('live-update', 'interval')])
def gen_plot():
    ind = ['a', 'b', 'c', 'd']
    df = pd.DataFrame({'one' : pd.Series([4., 3., 2., 1.], index=ind),
                       'two' : pd.Series([1., 2., 3., 4.], index=ind)})

    trace = [go.Scatter(x=df.index, y=df['one'])]
    fig   = plot_figure(trace)
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

问题是一开始什么都没有,在interval之后才更新,所以过了半天。我在Dash documentation之后添加了serve_layout函数,以便在页面加载时进行更新,但似乎没有效果。

第一次访问页面时如何进行第一次更新,然后在每个interval 更新?

【问题讨论】:

    标签: python-3.x plotly-dash


    【解决方案1】:

    基于plotly forum 的讨论,我找到了解决方案。您需要从serve_layout 内部调用gen_plot() 以获取最新数据。为了调用gen_plot,您需要从中移除装饰器。

    为了在serve_layout 中调用gen_plot,我在代码中将其向上移动,并在serve_layout 中将figure=gen_plot() 添加到dcc.Graph

    import dash
    import pandas as pd
    import plotly.graph_objs as go 
    import dash.dependencies as ddp
    import dash_core_components as dcc
    import dash_html_components as html
    
    second = 1000
    minute = 60
    hour   = 60
    day    = 24
    interval = 1/2*day*hour*minute*second
    
    def plot_figure(data):
        layout = dict(
            title="Figure w/ plotly",
        )
    
        fig = dict(data=data, layout=layout)
        return fig
    
    def gen_plot():
        ind = ['a', 'b', 'c', 'd']
        df = pd.DataFrame({'one' : pd.Series([4., 3., 2., 1.], index=ind),
                           'two' : pd.Series([1., 2., 3., 4.], index=ind)})
    
        trace = [go.Scatter(x=df.index, y=df['one'])]
        fig   = plot_figure(trace)
        return fig
    
    def serve_layout():
        return html.Div(children=[
            html.Div([
                html.H1("Plotly test with Live update",
                        style={"font-family": "Helvetica", 
                               "border-bottom": "1px #000000 solid"}),
                ], className='banner'),
            html.Div([dcc.Graph(id='plot', figure=gen_plot())],),
            dcc.Interval(id='live-update', interval=interval),
    ],)
    
    app = dash.Dash()
    
    app.layout = serve_layout
    
    app.callback(
        ddp.Output('plot', 'figure'),
        [],
        [],
        [ddp.Event('live-update', 'interval')])(gen_plot)
    
    if __name__ == '__main__':
        app.run_server(debug=True)
    

    请注意,在我的实际应用程序中,我还需要使用我用图形更新的文本摘录来执行此操作。我有一个 gen_text 函数,其装饰器与我的 gen_plot 函数相同,我应用了相同的策略,并在相关的 html.Div 中添加了一个 children=gen_text() 参数;像魅力一样工作!

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 2021-05-23
      • 2021-11-16
      • 1970-01-01
      • 2019-04-29
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多