【问题标题】:Dash DatePickerRange with Graph用图表破折号 DatePickerRange
【发布时间】:2021-10-31 03:33:35
【问题描述】:

我正在尝试将图表连接到 DatePickerRange。但是,在尝试连接图形和日期选择器时,我一直遇到问题。我有以下代码:

import dash
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
from datetime import datetime
import plotly.graph_objs as go
import plotly.express as px

controls = dbc.FormGroup(
    [
        html.P('Pick Date', style={
            'textAlign': 'center'
        }),
        dcc.DatePickerRange(
            id = "date-picker",
            start_date = datetime(2021,1,1),
            end_date = datetime.today(),
            display_format='MMMM Y, DD'
        ),

        html.Br(),
        dbc.Button(
            id='submit_button',
            n_clicks=0,
            children='Submit',
            color='primary',
            block=True
        ),
    ]
)

content_second_row = dbc.Row(
    [

        dbc.Col(
            dcc.Graph(id='graph_2'), md=4
        )
    ]
)

@app.callback(
    Output('graph_2', 'figure'),
    [Input('date-picker', 'start_date'),
    Input('date-picker', 'end_date')],
    [State('submit_button', 'n_clicks')])
def update_graph_2(n_clicks, start_date, end_date):
    fig = {
        'data': [{
            'x':  dfEconomic[(dfEconomic['Date']>start_date)&(dfEconomic['Date']<end_date)],
            'y': dfEconomic["Amount [DKK]"],
            'type': 'bar'
        }]
    }

    return fig

我尝试使用以下代码将日期值转换为日期帧:


for i in range(len(dfEconomic["Date"])):
    if isinstance(dfEconomic["Date"][i], str) == True:
        dfEconomic["Date"] =  datetime.strptime(dfEconomic["Date"][i], "%Y-%m-%d")

但这并没有帮助解决这种情况。我收到以下错误消息:

TypeError: invalid type comparison

谁能帮助我了解需要更改的内容?

The dataframe looks the following

【问题讨论】:

    标签: python plotly plotly-dash dashboard plotly-python


    【解决方案1】:
    • 模拟数据框并构建 dash 布局以使您的代码可运行
    • 三个核心问题
      1. 回调的参数顺序错误。 n_clicks 是最后一个参数
      2. 使用pd.to_datetime() 将字符串值转换为datetime64[ns]。创建了一个列表,然后可以用作 *argsbetween()
      3. 需要过滤xy所以使用了局部变量df
    import dash
    import dash_bootstrap_components as dbc
    import dash_core_components as dcc
    import dash_html_components as html
    from dash.dependencies import Input, Output, State
    from datetime import datetime
    import plotly.graph_objs as go
    import plotly.express as px
    import pandas as pd
    import numpy as np
    from jupyter_dash import JupyterDash
    
    app = JupyterDash(__name__)
    
    dfEconomic = pd.DataFrame({"Date": pd.date_range("1-jan-2021", "today")}).assign(
        **{"Amount [DKK]": lambda d: np.random.uniform(10, 200, len(d))}
    )
    
    controls = dbc.FormGroup(
        [
            html.P("Pick Date", style={"textAlign": "center"}),
            dcc.DatePickerRange(
                id="date-picker",
                start_date=datetime(2021, 1, 1),
                end_date=datetime.today(),
                display_format="MMMM Y, DD",
            ),
            html.Br(),
            dbc.Button(
                id="submit_button",
                n_clicks=0,
                children="Submit",
                color="primary",
                block=True,
            ),
        ]
    )
    
    content_second_row = dbc.Row([dbc.Col(dcc.Graph(id="graph_2"), md=4)])
    
    app.layout = html.Div([controls, content_second_row])
    
    
    @app.callback(
        Output("graph_2", "figure"),
        [Input("date-picker", "start_date"), Input("date-picker", "end_date")],
        [State("submit_button", "n_clicks")],
    )
    def update_graph_2(start_date, end_date, n_clicks):
        df = dfEconomic.loc[dfEconomic["Date"].between(*pd.to_datetime([start_date, end_date]))]
        fig = {"data": [{"x": df["Date"], "y": df["Amount [DKK]"], "type": "bar"}]}
    
        return fig
    
    
    if __name__ == "__main__":
        #     app.run_server(debug=True)
        app.run_server(mode="inline")
    

    【讨论】:

    • 看起来很棒!虽然缺少一些进口(?)。 dbc, html, dcc, datetime?顺便说一句,我一直都是自己做的。很容易遗漏一些东西,因为它们总是被导入到 elswehere 的同一个内核中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2022-09-29
    • 2011-11-05
    相关资源
    最近更新 更多