在短划线中,如何在选择单选按钮时使用回调来更新图表?

问题描述 投票:1回答:1

我是新手,我在查找回调中使用数据帧的示例时遇到了问题。我创建了每周单选按钮和每月单选按钮。

当选择每月单选按钮时,我希望图表从df_monthly中提取数据,其中每个条形图将是每月的工资总额。当选中每周单选按钮时,我希望每周都会看到图表填充每个条形图,这是数据框中的每一行,因为我每周都会收到一次付款。

我不确定我哪里出错了,但我一直收到一个错误陈述TypeError: update_fig() takes 0 positional arguments but 1 was given

图表填充没有数据,如下图所示。感谢您对此事的任何帮助。

enter image description here

import dash
import dash_core_components as dcc 
import dash_html_components as html 
import plotly.plotly as py
import plotly.graph_objs as go
import sqlite3
import pandas as pd
from functools import reduce
import datetime

conn = sqlite3.connect('paychecks.db')

df_ct = pd.read_sql('SELECT * FROM CheckTotal',conn)
df_earn = pd.read_sql('SELECT * FROM Earnings', conn)
df_whold = pd.read_sql('SELECT * FROM Withholdings', conn)

data_frames = [df_ct, df_earn, df_whold]
df_paystub = reduce(lambda  left,right: pd.merge(left,right,on=['Date'], how='outer'), data_frames)

def date_extraction(df):
    df['Date'] = pd.to_datetime(df['Date'])
    df['Year'] = df['Date'].dt.strftime('%Y')
    df['Month'] = df['Date'].dt.strftime('%B')
    df['Day'] = df['Date'].dt.strftime('%d')
    return df

date_extraction(df_paystub)

df_monthly = df_paystub.groupby(['Month']).sum()

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.css.append_css({'external_url': 'https://codepen.io/amyoshino/pen/jzXypZ.css'})

app.layout = html.Div(children=[

    html.Div([
        html.Div([
            dcc.RadioItems(
                        id='data-view',
                        options=[
                            {'label': 'Weekly', 'value': 'Weekly'},
                            {'label': 'Monthly', 'value': 'Monthly'},
                        ],
                        value='',
                        labelStyle={'display': 'inline-block'}
                    ),
        ], className = 'two columns'),

        html.Div([    
            dcc.Dropdown(
                id='year-dropdown',
                options=[
                        {'label': i, 'value': i} for i in df_paystub['Year'].unique()
                ],
                placeholder="Select a year",
            ),
        ], className='five columns'),

        html.Div([    
            dcc.Dropdown(
                id='month-dropdown',
                options=[
                  {'label': i, 'value': i} for i in df_paystub['Month'].unique()
                ],
                placeholder="Select a month(s)",
                multi=True,
            ),
        ], className='five columns'),
    ], className  = 'row'),


    # HTML ROW CREATED IN DASH
    html.Div([
        # HTML COLUMN CREATED IN DASH
        html.Div([
            # PLOTLY BAR GRAPH        
            dcc.Graph(
                id='pay',
            )
        ], className  = 'six columns'),

        # HTML COLUMN CREATED IN DASH
        html.Div([
            # PLOTLY LINE GRAPH
            dcc.Graph(
                id='hours',
                figure={
                    'data': [
                        go.Scatter(
                            x = df_earn['Date'],
                            y = df_earn['RegHours'],
                            mode = 'lines',
                            name = 'Regular Hours',
                        ),
                        go.Scatter(
                            x = df_earn['Date'],
                            y = df_earn['OtHours'],
                            mode = 'lines',
                            name = 'Overtime Hours',
                        )
                    ]
                }
            )
        ], className='six columns')
    ], className='row')
], className='ten columns offset-by-one')

@app.callback(dash.dependencies.Output('pay', 'figure'),
              [dash.dependencies.Input('data-view', 'value')])

def update_fig():
    figure={
        'data': [
            go.Bar(
                x = df_monthly['Month'],
                y = df_monthly['CheckTotal'],
                name = 'Take Home Pay',
            ),
                go.Bar(
                x = df_monthly['Month'],
                y = df_monthly['EarnTotal'],
                name = 'Earnings',
            )
        ],
        'layout': go.Layout(
            title = 'Take Home Pay vs. Earnings',
            barmode = 'group',
            yaxis = dict(title = 'Pay (U.S. Dollars)'),
            xaxis = dict(title = 'Date Paid')
        )
    }
    return figure

if __name__ == "__main__":
    app.run_server(debug=True)
python pandas dataframe plotly-dash plotly-python
1个回答
0
投票

嗨@ prime90欢迎来到Dash。

在浏览你的回调签名时,看起来update_fig()函数需要采用你给它的Input(使用dash.dependencies.Input)。

回调是发送此Input您指定的应用程序中的更改。所以它发送你的value#data-view给你的函数update_fig(),它目前不接受任何变量,导致错误信息。

只需更新您的函数签名并添加几个布尔变量,以摆脱错误并获得潜在的功能:


def update_fig(dataview_value):
    # define your weekly OR monthly dataframe 
    # you'll need to supply df_weekly similarly to df_monthly
    # though DO NOT modify these, see note below!
    df = df_weekly if dataview == 'weekly' else df_monthly
    dfkey = 'Week' if 'week' in df.columns else 'Month' # eh, worth a shot!
    figure={
        'data': [
            go.Bar(
                x = df[dfkey],
                y = df['CheckTotal'],
                name = 'Take Home Pay',
            ),
                go.Bar(
                x = df[dfkey],
                y = df['EarnTotal'],
                name = 'Earnings',
            )
        ],
        'layout': go.Layout(
            title = 'Take Home Pay vs. Earnings',
            barmode = 'group',
            yaxis = dict(title = 'Pay (U.S. Dollars)'),
            xaxis = dict(title = 'Date Paid')
        )
    }
    return figure

正如上面的评论中所写,你需要做一些先前的操作来创建一个df_weekly,就像你当前的df_monthly一样。

另外,我写的代码片段假设df列被命名为“Week”和“Month” - 显然需要更新这些。

Dash中的数据操作:

确保您阅读data sharing docs,因为它们突出显示数据永远不会被修改超出范围。

我希望这有帮助 :-)

© www.soinside.com 2019 - 2024. All rights reserved.