【发布时间】:2018-09-10 07:08:20
【问题描述】:
我尝试使用来自 plotly 的dash 制作交互式仪表板。我是它的初学者,因此我使用了example 来做到这一点。
代码应该从某个文件夹上传不同的数据文件,并根据某个列绘制直方图。每个文件的名称类似于"30092017ARB.csv" (date + ARB.csv)。代码循环遍历数据文件夹中的所有文件名,并在下拉底部打印文件名。选择文件名后,应将其上传并绘制直方图。我写了以下代码:
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import pandas as pd
#
from os import listdir
from os.path import isfile, join
import numpy as np
#
mypath='/Users/Python/BeN_/data/'
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
app = dash.Dash()
app.layout = html.Div([
html.H2("Ausfallsreport"),
html.Div(
[
dcc.Dropdown(
id="dataFH",
options=[{
'label': i,
'value': i
} for i in onlyfiles],
value=" "),
],
style={'width': '25%',
'display': 'inline-block'}),
dcc.Graph(id='Mygraph'),
])
@app.callback(
dash.dependencies.Output('Mygraph', 'figure'),
[dash.dependencies.Input('dataFH', 'value')])
def update_graph(dataFH):
df = pd.read_csv(mypath+dataFH, delimiter=';',encoding='cp1252')
# aggregate
dfagg = df.groupby('Bestand', as_index=False).agg({'MW': 'sum'})
# make strings for x-axis
x=["BE-"+s for s in[str(s) for s in [int(x) for x in dfagg.iloc[:,0].tolist()]]]
y=dfagg.ix[:,1].tolist()
trace = go.Bar(x=x, y=y, name='Declined')
return {
'data': [trace],
'layout':
go.Layout(
title='Customer Order Status for {}'.format(dataFH),
barmode='bar',
yaxis=dict(tickformat=".2%"))
}
if __name__ == '__main__':
app.run_server(debug=True)
【问题讨论】:
-
去掉下拉属性
value = ' '并用placeholder = "select a file"替换它。属性value引用下拉列表中的一个值,该值应该存在于下拉列表的选项中。如果您不想进行任何初始选择,请将value替换为属性placeholder,这可能是一个指令或一个虚假的选择,如果您愿意,则会给出一个提示,并在下拉字段中显示为灰色。
标签: python dashboard plotly-dash