我试图将所有输出放在一个函数中,该函数通过单个回调为多个输出更新,如下面的代码所示。但是,仪表板仅显示第一个图表,其余显示为空白。该代码编译并运行。 为了进行实验,我试图更改应用程序的布局和回调的顺序,但是最有效的方法是在仪表板上的其他图表而非第一个图表上显示显示。该函数唯一显示的部分是收益变量,它是函数中首先声明的变量。我采用了一种方法来使用多个输出,并在函数中一个一个地声明所有变量,然后在一行中返回它们。我只需要弄清楚使所有输出正常工作所需的内容。目前不使用间隔回调,因为我计划以后使用它来更新将从站点中抓取的数据。 我在下面添加了相关代码以及仪表板外观的屏幕截图。Link to dashboard screenshot
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Output, Input
import plotly.graph_objs as go
import numpy as np
import pandas as pd
data=pd.read_csv('C:\sepdata.csv')
df=data[['date','symbol','shares','anet pl']]
#calculates total revenues
def calculate_revs(x):
#calculates total costs
def calculate_costs(x):
#average revenue
def calculate_arpt(x):
#average cost
def calculate_acpt(x):
#revenue standard deviation
def calculate_revstd(x):
#cost standard deviation
def calculate_coststd(x):
#income/costs
def calculate_netmargin(x):
#takes in other functions to return trailing length series
def mastercalc(df,length,function):
start=len(df)-length
end=len(df)
mainlist=[]
for i in range(0,100):
s=start-i
e=end-i
d=df[s:e]
mainlist.append(function(d))
return mainlist
app = dash.Dash()
app.layout = html.Div([
dcc.Graph(id='total-revenues', style={'width': '50.1%', 'display': 'inline-block'}),
dcc.Graph(id='total-costs', style={'width': '49.9%', 'display': 'inline-block'}),
dcc.Graph(id='net-margin', style={'width': '100%', 'display': 'inline-block'}),
dcc.Graph(id='arpt', style={'width': '50.1%', 'display': 'inline-block'}),
dcc.Graph(id='acpt', style={'width': '49.9%', 'display': 'inline-block'}),
dcc.Graph(id='revstd', style={'width': '50.1%', 'display': 'inline-block'}),
dcc.Graph(id='coststd', style={'width': '49.9%', 'display': 'inline-block'}),
dcc.Interval(id='interval', interval=3000, n_intervals=0)
])
@app.callback([Output('total-revenues', 'figure'),
Output('total-costs','figure'),
Output('net-margin','figure'),
Output('arpt','figure'),
Output('acpt','figure'),
Output('revstd','figure'),
Output('coststd','figure')],
[Input('interval', 'n_intervals')])
def upd_figs(n):
x = np.arange(1, 101)
revs = mastercalc(df, 100, calculate_revs)
data = go.Bar(
x=list(x),
y=list(reversed(revs)),
opacity=0.70,
marker={'color': 'rgb(0,180,0)'}
)
revenues= {
'data': [data],
'layout': go.Layout(
xaxis={'title': 'Trailing Number', 'range': [min(list(x)), max(list(x))]},
yaxis={'title': 'Total Revenues', 'range': [0.8 * min(list(revs)), 1.2 * max(list(revs))]},
margin={'l': 40, 't': 40, 'b': 30, 'r': 20},
hovermode='closest',
plot_bgcolor='rgb(0,0,0)',
paper_bgcolor='rgb(0,0,0)',
font={'color': 'rgb(255,255,255)'}
# transition={'duration':1000}
)
}
#costs
xC = np.arange(1, 101)
cost = mastercalc(df, 100, calculate_costs)
dataC = go.Bar(
x=list(xC),
y=list(reversed(cost)),
opacity=0.70,
marker={'color': 'rgb(180,0,0)'}
)
costs= {
'data': [dataC],
'layout': dict(
xaxis={'title': 'Trailing Number', 'range': [min(list(x)), max(list(x))]},
yaxis={'title': 'Total Costs', 'range': [1.2 * min(list(revs)), 0.8 * max(list(revs))]},
margin={'l': 40, 't': 40, 'b': 30, 'r': 20},
hovermode='closest',
plot_bgcolor='rgb(0,0,0)',
paper_bgcolor='rgb(0,0,0)',
font={'color': 'rgb(255,255,255)'}
# transition={'duration':1000}
)
}
#netmargin
nm = mastercalc(df, 100, calculate_netmargin)
data = go.Bar(
x=list(x),
y=list(reversed(nm)),
opacity=0.70,
marker={'color': 'rgb(153,216,240)'}
)
netmargin= {
'data': [data],
'layout': go.Layout(
xaxis={'title': 'Trailing Number', 'range': [min(list(x)), max(list(x))]},
yaxis={'title': 'Net Margin Ratio', 'range': [0.8 * min(list(revs)), 1.2 * max(list(revs))]},
margin={'l': 40, 't': 40, 'b': 30, 'r': 20},
hovermode='closest',
plot_bgcolor='rgb(0,0,0)',
paper_bgcolor='rgb(0,0,0)',
font={'color': 'rgb(255,255,255)'}
# transition={'duration':1000}
)
}
#arpt
rpt = mastercalc(df, 100, calculate_arpt)
data = go.Bar(
x=list(x),
y=list(reversed(rpt)),
opacity=0.70,
marker={'color': 'rgb(0,180,0)'}
)
arpt= {
'data': [data],
'layout': dict(
xaxis={'title': 'Trailing Number', 'range': [min(list(x)), max(list(x))]},
yaxis={'title': 'ARPT', 'range': [0.8 * min(list(revs)), 1.2 * max(list(revs))]},
margin={'l': 40, 't': 40, 'b': 30, 'r': 20},
hovermode='closest',
plot_bgcolor='rgb(0,0,0)',
paper_bgcolor='rgb(0,0,0)',
font={'color': 'rgb(255,255,255)'}
# transition={'duration':1000}
)
}
#acpt
cpt = mastercalc(df, 100, calculate_acpt)
data = go.Bar(
x=list(x),
y=list(reversed(cpt)),
opacity=0.70,
marker={'color': 'rgb(180,0,0)'}
)
acpt= {
'data': [data],
'layout': dict(
xaxis={'title': 'Number', 'range': [min(list(x)), max(list(x))]},
yaxis={'title': 'ACPT', 'range': [1.2 * min(list(revs)), 0.8 * max(list(revs))]},
margin={'l': 40, 't': 40, 'b': 30, 'r': 20},
hovermode='closest',
plot_bgcolor='rgb(0,0,0)',
paper_bgcolor='rgb(0,0,0)',
font={'color': 'rgb(255,255,255)'}
# transition={'duration':1000}
)
}
#revstd
rstd = mastercalc(df, 100, calculate_revstd)
data = go.Scatter(
x=list(x),
y=list(reversed(rstd)),
mode='lines+markers',
opacity=0.70,
marker={'color': 'rgb(0,180,0)'}
)
revstd= {
'data': [data],
'layout': dict(
xaxis={'title': 'Number', 'range': [min(list(x)), max(list(x))]},
yaxis={'title': 'Rev Stdev', 'range': [0.8 * min(list(revs)), 1.2 * max(list(revs))]},
margin={'l': 40, 't': 40, 'b': 30, 'r': 20},
hovermode='closest',
plot_bgcolor='rgb(0,0,0)',
paper_bgcolor='rgb(0,0,0)',
font={'color': 'rgb(255,255,255)'}
# transition={'duration':1000}
)
}
#coststd
cstd = mastercalc(df, 100, calculate_coststd)
data = go.Scatter(
x=list(x),
y=list(reversed(cstd)),
mode='lines+markers',
opacity=0.70,
marker={'color': 'rgb(180,0,0)'}
)
coststd= {
'data': [data],
'layout': dict(
xaxis={'title': 'Number', 'range': [min(list(x)), max(list(x))]},
yaxis={'title': 'Cost Stdev', 'range': [1.2 * min(list(revs)), 0.8 * max(list(revs))]},
margin={'l': 40, 't': 40, 'b': 30, 'r': 20},
hovermode='closest',
plot_bgcolor='rgb(0,0,0)',
paper_bgcolor='rgb(0,0,0)',
font={'color': 'rgb(255,255,255)'}
# transition={'duration':1000}
)
}
return revenues,costs,netmargin,arpt,acpt,revstd,coststd
if __name__=='__main__':
app.run_server(debug=True)
您不能在一个回调中具有多个输出您可以在一个回调的回调中有多个输入]
因此,基本上每个输出都需要一个单独的回调