
Dash框架
本章將詳細討論Dash框架。
Dash是一個開源的Python框架,用於構建分析型Web應用程式。它是一個強大的庫,簡化了資料驅動應用程式的開發。它尤其適用於不太熟悉Web開發的Python資料科學家。使用者可以使用Dash在瀏覽器中建立令人驚歎的儀表板。
Dash建立在Plotly.js、React和Flask之上,它將現代UI元素(如下拉選單、滑塊和圖表)直接繫結到您的分析型Python程式碼。
Dash應用程式由一個Flask伺服器組成,該伺服器使用HTTP請求透過JSON資料包與前端React元件通訊。
Dash應用程式完全用Python編寫,因此無需HTML或JavaScript。
Dash安裝
如果您的終端中尚未安裝Dash,請安裝以下提到的Dash庫。由於這些庫處於積極開發中,請頻繁安裝和升級它們。Python 2和3也受支援。
- pip install dash==0.23.1 # Dash核心後端
- pip install dash-renderer==0.13.0 # Dash前端
- pip install dash-html-components==0.11.0 # HTML元件
- pip install dash-core-components==0.26.0 # 高階元件
- pip install plotly==3.1.0 # Plotly繪相簿
為了確保一切正常執行,這裡我們建立了一個簡單的dashApp.py檔案。
Dash或應用程式佈局
Dash應用程式由兩部分組成。第一部分是應用程式的“佈局”,它基本上描述了應用程式的外觀。第二部分描述了應用程式的互動性。
核心元件
我們可以使用dash_html_components和dash_core_components庫構建佈局。Dash為應用程式的所有可視元件提供了Python類。我們還可以使用JavaScript和React.js自定義我們自己的元件。
import dash_core_components as dcc
import dash_html_components as html
dash_html_components用於所有HTML標籤,而dash_core_components用於使用React.js構建的互動性。
使用以上兩個庫,讓我們編寫如下程式碼:
app = dash.Dash() app.layout = html.Div(children=[ html.H1(children='Hello Dash'), html.Div(children='''Dash Framework: A web application framework for Python.''')
等效的HTML程式碼如下所示:
<div> <h1> Hello Dash </h1> <div> Dash Framework: A web application framework for Python. </div> </div>
編寫簡單的Dash應用程式
我們將學習如何使用上述庫在檔案dashApp.py中編寫一個簡單的Dash示例。
# -*- coding: utf-8 -*- import dash import dash_core_components as dcc import dash_html_components as html app = dash.Dash() app.layout = html.Div(children=[ html.H1(children='Hello Dash'), html.Div(children='''Dash Framework: A web application framework for Python.'''), dcc.Graph( id='example-graph', figure={ 'data': [ {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'Delhi'}, {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Mumbai'}, ], 'layout': { 'title': 'Dash Data Visualization' } } ) ]) if __name__ == '__main__': app.run_server(debug=True)
執行Dash應用程式
執行Dash應用程式時,請注意以下幾點。
(MyDjangoEnv) C:\Users\rajesh\Desktop\MyDjango\dash>python dashApp1.py
正在提供Flask應用程式“dashApp1”(延遲載入)
環境:生產環境
警告:不要在生產環境中使用開發伺服器。
請改用生產WSGI伺服器。
除錯模式:開啟
使用stat重新啟動
偵錯程式已啟用!
偵錯程式PIN:130-303-947
正在運行於http://127.0.0.1:8050/(按CTRL+C退出)
127.0.0.1 - - [12/Aug/2018 09:32:39] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [12/Aug/2018 09:32:42] "GET /_dash-layout HTTP/1.1" 200 - 127.0.0.1 - - [12/Aug/2018 09:32:42] "GET /_dash-dependencies HTTP/1.1" 200 - 127.0.0.1 - - [12/Aug/2018 09:32:42] "GET /favicon.ico HTTP/1.1" 200 - 127.0.0.1 - - [12/Aug/2018 09:39:52] "GET /favicon.ico HTTP/1.1" 200 -
在您的Web瀏覽器中訪問http://127.0.0.1:8050/。您應該會看到一個如下所示的應用程式。

在上述程式中,需要注意以下幾點:
應用程式佈局由“元件”(如html.Div和dcc.Graph)組成的樹組成。
dash_html_components庫為每個HTML標籤提供了一個元件。html.H1 (children = ‘Hello Dash’)元件在您的應用程式中生成一個<h1> Hello Dash </h1> HTML元素。
並非所有元件都是純HTML。dash_core_components描述了更高級別的元件,這些元件具有互動性,並透過React.js庫使用JavaScript、HTML和CSS生成。
每個元件都完全透過關鍵字屬性來描述。Dash是宣告式的:您主要透過這些屬性來描述您的應用程式。
children屬性是特殊的。按照慣例,它始終是第一個屬性,這意味著您可以省略它。
Html.H1 (children='Hello Dash')與html.H1 ('Hello Dash')相同。
您應用程式中的字型外觀與此處顯示的略有不同。此應用程式使用自定義CSS樣式表來修改元素的預設樣式。允許自定義字型樣式,但目前,我們可以新增以下URL或您選擇的任何URL:
app.css.append_css ({“external_url”:https://codepen.io/chriddyp/pen/bwLwgP.css}) 以獲得與這些示例相同的外觀和感覺。
更多關於HTML
dash_html_components庫包含每個HTML標籤的元件類以及所有HTML引數的關鍵字引數。
讓我們在之前的應用程式文字中新增元件的內聯樣式:
# -*- coding: utf-8 -*- import dash import dash_core_components as dcc import dash_html_components as html app = dash.Dash() colors = { 'background': '#87D653', 'text': '#ff0033' } app.layout = html.Div(style={'backgroundColor': colors['background']}, children=[ html.H1( children='Hello Dash', style={ 'textAlign': 'center', 'color': colors['text'] } ), html.Div(children='Dash: A web application framework for Python.', style={ 'textAlign': 'center', 'color': colors['text'] }), dcc.Graph( id='example-graph-2', figure={ 'data': [ {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'Delhi'}, {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Mumbai'}, ], 'layout': { 'plot_bgcolor': colors['background'], 'paper_bgcolor': colors['background'], 'font': { 'color': colors['text'] } } } ) ]) if __name__ == '__main__': app.run_server(debug=True)
在上面的示例中,我們使用style屬性修改了html.Div和html.H1元件的內聯樣式。

它在Dash應用程式中呈現如下:

dash_html_components和HTML屬性之間存在一些關鍵區別:
對於Dash中的style屬性,您可以只提供一個字典,而在HTML中,它是一個用分號分隔的字串。
樣式字典鍵是駝峰式的,因此text-align更改為textalign。
Dash中的ClassName類似於HTML class屬性。
第一個引數是HTML標籤的子元素,透過children關鍵字引數指定。
可重用元件
透過用Python編寫標記,我們可以建立複雜的、可重用的元件(如表格),而無需切換上下文或語言:
以下是一個快速示例,它從pandas資料幀生成一個“表格”。
import dash import dash_core_components as dcc import dash_html_components as html import pandas as pd df = pd.read_csv( 'https://gist.githubusercontent.com/chriddyp/' 'c78bf172206ce24f77d6363a2d754b59/raw/' 'c353e8ef842413cae56ae3920b8fd78468aa4cb2/' 'usa-agricultural-exports-2011.csv') def generate_table(dataframe, max_rows=10): return html.Table( # Header [html.Tr([html.Th(col) for col in dataframe.columns])] + # Body [html.Tr([ html.Td(dataframe.iloc[i][col]) for col in dataframe.columns ]) for i in range(min(len(dataframe), max_rows))] ) app = dash.Dash() app.layout = html.Div(children=[ html.H4(children='US Agriculture Exports (2011)'), generate_table(df) ]) if __name__ == '__main__': app.run_server(debug=True)
我們的輸出將類似於:

更多關於視覺化
dash_core_components庫包含一個名為Graph的元件。
Graph使用開源plotly.js JavaScript繪相簿呈現互動式資料視覺化。Plotly.js支援大約35種圖表型別,並以向量質量SVG和高效能WebGL呈現圖表。
以下是一個從Pandas資料幀建立散點圖的示例:
import dash import dash_core_components as dcc import dash_html_components as html import pandas as pd import plotly.graph_objs as go app = dash.Dash() df = pd.read_csv( 'https://gist.githubusercontent.com/chriddyp/' + '5d1ea79569ed194d432e56108a04d188/raw/' + 'a9f9e8076b837d541398e999dcbac2b2826a81f8/'+ 'gdp-life-exp-2007.csv') app.layout = html.Div([ dcc.Graph( id='life-exp-vs-gdp', figure={ 'data': [ go.Scatter( x=df[df['continent'] == i]['gdp per capita'], y=df[df['continent'] == i]['life expectancy'], text=df[df['continent'] == i]['country'], mode='markers', opacity=0.7, marker={ 'size': 15, 'line': {'width': 0.5, 'color': 'white'} }, name=i ) for i in df.continent.unique() ], 'layout': go.Layout( xaxis={'type': 'log', 'title': 'GDP Per Capita'}, yaxis={'title': 'Life Expectancy'}, margin={'l': 40, 'b': 40, 't': 10, 'r': 10}, legend={'x': 0, 'y': 1}, hovermode='closest' ) } ) ]) if __name__ == '__main__': app.run_server()
上述程式碼的輸出如下所示:

這些圖表是互動式和響應式的。您可以將滑鼠懸停在點上以檢視其值,單擊圖例專案以切換軌跡,單擊並拖動以縮放,按住Shift鍵並單擊並拖動以平移。
Markdown
雖然dash透過dash_html_components庫公開HTML風格,但用HTML編寫文字可能很繁瑣。對於編寫文字塊,您可以使用dash_core_components庫中的Markdown元件。
核心元件
dash_core_components包含一組更高級別的元件,如下拉選單、圖表、markdown塊等等。
與所有其他Dash元件一樣,它們完全透過宣告式方式描述。每個可配置選項都作為元件的關鍵字引數提供。
以下是一個示例,它使用了一些可用的元件:
# -*- coding: utf-8 -*- import dash import dash_core_components as dcc import dash_html_components as html app = dash.Dash() app.layout = html.Div([ html.Label('Dropdown'), dcc.Dropdown( options=[ {'label': 'New York City', 'value': 'NYC'}, {'label': u'Montréal', 'value': 'MTL'}, {'label': 'San Francisco', 'value': 'SF'} ], value='MTL' ), html.Label('Multi-Select Dropdown'), dcc.Dropdown( options=[ {'label': 'New York City', 'value': 'NYC'}, {'label': u'Montréal', 'value': 'MTL'}, {'label': 'San Francisco', 'value': 'SF'} ], value=['MTL', 'SF'], multi=True ), html.Label('Radio Items'), dcc.RadioItems( options=[ {'label': 'New York City', 'value': 'NYC'}, {'label': u'Montréal', 'value': 'MTL'}, {'label': 'San Francisco', 'value': 'SF'} ], value='MTL' ), html.Label('Checkboxes'), dcc.Checklist( options=[ {'label': 'New York City', 'value': 'NYC'}, {'label': u'Montréal', 'value': 'MTL'}, {'label': 'San Francisco', 'value': 'SF'} ], values=['MTL', 'SF'] ), html.Label('Text Input'), dcc.Input(value='MTL', type='text'), html.Label('Slider'), dcc.Slider( min=0, max=9, marks={i: 'Label {}'.format(i) if i == 1 else str(i) for i in range(1, 6)}, value=5, ), ], style={'columnCount': 2}) if __name__ == '__main__': app.run_server(debug=True)
上述程式的輸出如下:

呼叫幫助
Dash元件是宣告式的。這些元件的每個可配置方面都在安裝期間作為關鍵字引數設定。您可以在Python控制檯中呼叫任何元件的幫助資訊,以瞭解更多關於元件及其可用引數的資訊。其中一些如下所示:
>>> help(dcc.Dropdown) Help on class Dropdown in module builtins: class Dropdown(dash.development.base_component.Component) | A Dropdown component. | Dropdown is an interactive dropdown element for selecting one or more | items. | The values and labels of the dropdown items are specified in the `options` | property and the selected item(s) are specified with the `value` property. | | Use a dropdown when you have many options (more than 5) or when you are | constrained for space. Otherwise, you can use RadioItems or a Checklist, | which have the benefit of showing the users all of the items at once. | | Keyword arguments: | - id (string; optional) | - options (list; optional): An array of options | - value (string | list; optional): The value of the input. If `multi` is false (the default) -- More --
總而言之,Dash應用程式的佈局描述了應用程式的外觀。佈局是元件的分層樹。dash_html_components庫為所有HTML標籤和關鍵字引數提供類,並描述HTML屬性(如style、className和id)。dash_core_components庫生成更高級別的元件,如控制元件和圖表。