2

Python (3.x) で plotly Dash (0.18.3) でライブ更新を使用しようとしていますが、プロットを頻繁に更新する必要はありません (1 日に 1 回か 2 回必要です)。

これまでに次のことを行いました。

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 のドキュメントserve_layoutに従って関数を追加しましたが、効果がないようです。

ページが最初にアクセスされ、その後毎回更新されるときに最初の更新を行うにはどうすればよいintervalですか?

4

1 に答える 1

0

plotly forumでの議論に基づいて、解決策を見つけました。最新の数値を取得するにはgen_plot()、内部から呼び出す必要があります。serve_layoutを呼び出すgen_plotには、デコレータを削除する必要があります。

gen_plotinsideを呼び出すには、コード内で上に移動してinserve_layoutに追加figure=gen_plot()します。dcc.Graphserve_layout

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同じ戦略を適用children=gen_text()し、関連する引数に引数を追加しましたhtml.Div。魔法のように機能します!

于 2017-10-06T09:08:15.193 に答える