Периодически обновляемые цифры в графическом - PullRequest
1 голос
/ 17 июня 2020

Ниже приведен простой скрипт, который извлекает данные о живом населении. Он периодически обновляется и обновляет график:

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import dash_bootstrap_components as dbc


# Retrieve data
link = requests.get("https://countrymeters.info/en/World").text
table = pd.read_html(link)[0]
table = table
figure = table.iplot(asFigure=True, kind='bar',xTitle='Source: World',yTitle='Live Pop',title='Population')

# Dash app
app = dash.Dash(external_stylesheets=[dbc.themes.LUX])

# Bootstrap CSS
app.css.append_css({"external_url": "https://codepen.io/amyoshino/pen/jzXypZ.css"})
link = session.get("https://countrymeters.info/en/World").text

app.layout = html.Div(children=[
    html.H1("Population Data Scrape"),

    html.Div(children=
    '''
    A summary of the latest population data across the globe.
    '''     ),

    # Graph 1
    html.Div([
        dcc.Tabs([ #Tab 1
            dcc.Tab(label="Population Data", children=[

                html.Div([
                    dcc.Graph(
                        id = "Data",
                        figure = table.iplot(asFigure=True, kind='bar',xTitle='Source: World',yTitle='Live Pop',title='Population')
                            ),
                            dcc.Interval(
                                id="4secinterval",
                                interval="4000",
                                n_intervals=0
                            )], className = "six columns"),



                        ]),


                ])
            ])
        ])


# Update graph
@app.callback(Output("Data", "figure"),
            [Input("4secinterval", "n_intervals")])
def draw_figure(n):      
    test = session.get("https://countrymeters.info/en/World").text
    table = pd.read_html(test)[0]
    table = table
    figure = table.iplot(asFigure=True, kind='bar',xTitle='Source: World',yTitle='Live Pop',title='Population')
    return figure

if __name__ == "__main__":
    app.run_server(debug=False)

В разделе «график обновлений» моего кода, чтобы график обновился, мне нужно снова вызвать веб-очистку, чтобы получить последние данные и определить их. в целом функция. Я пробовал определить функцию раньше и использовал:

@app.callback(Output("Data", "figure"),
            [Input("4secinterval", "n_intervals")])
draw_figure(n)

, который, как я надеялся, просто вернет цифру, однако это не работает. Есть ли способ в plotly / Da sh обновить фигуру более коротким способом (то есть без необходимости заново очищать и форматировать данные)?

1 Ответ

1 голос
/ 23 июня 2020

Загвоздка здесь в разделе dcc.Graph. Вы вызываете глобальную переменную table.iplot(), где таблица определена как глобальная переменная в вашем разделе извлечения.

Попробуйте поместить все функции в отдельный файл, скажем, `полезные_functions.py '

def draw_graph():
  link = requests.get("https://countrymeters.info/en/World").text
  table = pd.read_html(link)[0]
  table = table
  figure = table.iplot(asFigure=True, kind='bar',xTitle='Source: World',yTitle='Live Pop',title='Population')
  return figure
the_graph = draw_graph()

Теперь, в вашем основном файле, как указано выше, удалите глобальное объявление table и figure. Чтобы отобразить график, в разделе графика вызовите функцию draw_graph() как:

 import useful_functions as uf
 <rest of the html app code>
 dcc.Graph(
   id = "graph_id",
   figure = uf.the_graph
),

Это вызовет график в первый раз при загрузке. Теперь для бита refre sh, callback будет выглядеть так:

@app.callback(Output("Data", "figure"),
        [Input("4secinterval", "n_intervals")])
def draw_figure(n):
    fig = uf.draw_graph()
    return fig
...