Python的Web可視化框架Dash(3)---布局

【Dash系列】Python的Web可視化框架Dash(1)---簡介
【Dash系列】Python的Web可視化框架Dash(2)---安裝
【Dash系列】Python的Web可視化框架Dash(3)---布局設(shè)置
【Dash系列】Python的Web可視化框架Dash(4)---基本回調(diào)
【Dash系列】Python的Web可視化框架Dash(5)---狀態(tài)和預(yù)更新
【Dash系列】Python的Web可視化框架Dash(6)---交互和過濾
【Dash系列】Python的Web可視化框架Dash(7)---回調(diào)共享
【Dash系列】Python的Web可視化框架Dash(8)---核心組件

本節(jié)通過6個(gè)獨(dú)立的示例,介紹Dash應(yīng)用程序的基本使用方法



Dash應(yīng)用程序由兩部分組成扯饶。第一部分是布局(layout)恒削,描述應(yīng)用程序的設(shè)計(jì)樣式池颈;第二部分描述了應(yīng)用程序的交互性。

Dash為應(yīng)用程序的所有可視化組件钓丰,提供了Python類躯砰,在dash_core_components庫和dash_html_components庫中,進(jìn)行組件的維護(hù)携丁。當(dāng)然弃揽,也可以使用 JavaScript 和 React.js 構(gòu)建自己的組件。

導(dǎo)入本章所有用到的包则北,下文不再說明

import pandas as pd
import plotly.graph_objs as go
import dash
import dash_core_components as dcc                  # 交互式組件
import dash_html_components as html                 # 代碼轉(zhuǎn)html
from dash.dependencies import Input, Output         # 回調(diào)
from jupyter_plotly_dash import JupyterDash         # Jupyter中的Dash,如有疑問痕慢,見系列文章第2篇【安裝】


一尚揣、第一個(gè)Dash

(一) 代碼

app = JupyterDash('Hello Dash', )
app.layout = html.Div(
    children = [
        html.H1('你好,Dash'),
        html.Div('''Dash: Python網(wǎng)絡(luò)應(yīng)用框架'''),
        dcc.Graph(
            id='example-graph',
            figure = dict(
                data = [{'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': '北京'},
                        {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': '上海'}],
                layout = dict(title = 'Dash數(shù)據(jù)可視化')
            )
        )
    ]
)

app

(二) 效果圖

(三) 說明

  1. 布局 layouthtml.Divdcc.Graph 這樣的組件樹組成掖举;

  2. Dash是 聲明式 的快骗,通過關(guān)鍵字參數(shù)描述組件。即Dash主要通過屬性描述應(yīng)用塔次,如 style方篮、className、id等励负;

  3. dash_html_components 庫為每個(gè)HTML標(biāo)簽都提供了對應(yīng)的組件藕溅。本例中:html.H1(children='Hello Dash')可以生成<h1>你好,Dash</h1>這樣的HTML語句继榆。并非所有組件都使用純HTML語言巾表;

  4. dash_core_components 這種交互式高階組件庫,是由JavaScript略吨、HTML和CSS編寫集币,并由React.js庫生成,用于設(shè)置互動(dòng)性圖表組件翠忠,如控件、圖形等秽之,其語法類似Plotly;

  5. 按照慣例趾访,children 始終是第一個(gè)屬性,可以省略董虱,即 html.H1(children='Hello Dash')html.H1('Hello Dash')相同扼鞋,本例中,聲明了3次云头,實(shí)際上都可以忽略。另外溃槐,它還可以包含字符串匣砖、數(shù)字、單個(gè)組件或組件列表昏滴。

二、自定義HTML文本樣式

(一) 代碼

app = JupyterDash('Hello Dash Style')
colors = dict(background = '#111111', text = '#7FDBFF')

app.layout = html.Div(
    style = dict(backgroundColor = colors['background']),
    children = [
        html.H1(
            children='你好拂共,Dash',
            style = dict(textAlign = 'center', color = colors['text'])),
        html.Div(
            children='Dash:Python網(wǎng)絡(luò)應(yīng)用框架',
            style = dict(textAlign = 'center', color = colors['text'])),
        dcc.Graph(
            id='example-graph-2',
            figure = dict(
                data = [{'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': '北京'},
                        {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': '天津'}],
                layout = dict(
                    plot_bgcolor = colors['background'], 
                    paper_bgcolor = colors['background'],
                    font = dict(color = colors['text'])
                )
            )
        )
    ]
)

app

(二) 效果圖

(三) 說明

  1. dash_html_components 庫除了為HTML參數(shù)提供了關(guān)鍵字外姻几,還為每個(gè)HTML標(biāo)簽提供了組件類;
  2. 示例中抚恒,使用 style 屬性修改了 html.Divhtml.H1components 行內(nèi)樣式;
  3. dash_html_componentsHTML 屬性俭驮,與 HTML 屬性之間存以下幾點(diǎn)差異:
  • HTML中的style屬性是以分號(hào)分隔的字符串春贸;Dash用的是字典;
  • Dash的style字典鍵是 camelCased(駝峰式) 命名法祥诽,HTML 中的 text-align,在style字典中為 textAlign厘熟;
  • HTMLclass 屬性维哈,對應(yīng)Dash中的 className
  • HTML 的子項(xiàng)是通過 children關(guān)鍵字參數(shù)指定的阔挠,按照慣例,這始終是第一個(gè)參數(shù)跪削,經(jīng)常被省略;
  • 除了上述外碾盐,其他所有HTML屬性與標(biāo)簽,在Python中都有效掀虎。

三付枫、可重復(fù)使用的組件

(一) 代碼

# 數(shù)據(jù)源:美國農(nóng)業(yè)出口(2011年)
df = pd.read_csv(
    'https://gist.githubusercontent.com/chriddyp/'
    'c78bf172206ce24f77d6363a2d754b59/raw/'
    'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
    'usa-agricultural-exports-2011.csv')

# 定義表格組件
def create_table(df, max_rows=12):
    """基于dataframe,設(shè)置表格格式"""
    
    table = html.Table(
        # Header
        [
            html.Tr(
                [
                    html.Th(col) for col in df.columns
                ]
            )
        ] +
        # Body
        [
            html.Tr(
                [
                    html.Td(
                        df.iloc[i][col]
                    ) for col in df.columns
                ]
            ) for i in range(min(len(df), max_rows))
        ]   
    )
    return table

# 設(shè)置Dash應(yīng)用程序
app = JupyterDash('Defining Components')
app.layout = html.Div(
    children = [
        html.H4(children = '美國農(nóng)業(yè)出口數(shù)據(jù)表(2011年)'),
        create_table(df)
    ]
)
app

(二) 效果圖

(三) 說明

  1. 在Python中定義方法二打,Dash通過調(diào)用,可以創(chuàng)建復(fù)雜的可重用組件叶眉,如表格等,無需切換上下文或語言芹枷;
  2. 本示例實(shí)現(xiàn)的功能,是從Pandas的數(shù)據(jù)幀生成“表格”鸳慈。

四、可視化散點(diǎn)圖

(一) 代碼

# 數(shù)據(jù)源
df = pd.read_csv(
    'https://gist.githubusercontent.com/chriddyp/' +
    '5d1ea79569ed194d432e56108a04d188/raw/' +
    'a9f9e8076b837d541398e999dcbac2b2826a81f8/'+
    'gdp-life-exp-2007.csv')

app = JupyterDash('Scatter Plot')
app.layout = html.Div([
    dcc.Graph(
        id = 'life-exp-vs-gdp',
        figure = dict(
            data = [
                go.Scatter(
                    x = df[df['continent'] == i]['gdp per capita'],
                    y = df[df['continent'] == i]['life expectancy'],
                    text = df[df['continent'] == i]['country'],
                    name = i,
                    mode = 'markers',
                    opacity = 0.8,
                    marker = dict(size = 15, line = dict(width = 0.5, color = 'white'))  
                ) for i in df.continent.unique()],
            layout = go.Layout(
                xaxis = dict(type = 'log', title = 'GDP Per Capita'),
                yaxis = dict(title = 'Life Expectancy'),
                margin = {'l': 40, 'b': 40, 't': 10, 'r': 10},
                legend = dict(x = 0, y = 1),
                hovermode = 'closest'
            )  
        )
    )
])

app

(二) 效果圖

(三) 說明

  1. dash_core_components 庫包含一個(gè)名為的組件Graph,其使用開源JavaScript圖形庫plotly.js 翁逞,呈現(xiàn)交互式數(shù)據(jù)可視化;
  2. Plotly.js 支持超過35種圖表類型状植,并以矢量質(zhì)量SVG和高性能WebGL的方式呈現(xiàn)圖表怨喘;
  3. dash_core_components.Graph 組件的參數(shù) figure ,與開放源碼的 Python 圖形庫 Plotly 中的參數(shù) figure使用方法肉拓,都是一樣的梳庆;
  4. 這些圖表具有互動(dòng)性和響應(yīng)性:
  • 將鼠標(biāo)懸停在點(diǎn)上以查看其值卑惜;
  • 單擊圖例項(xiàng)以切換軌跡丧肴;
  • 單擊并拖動(dòng)以縮放;
  • 按住shift后單擊并拖動(dòng)芋浮,可以平移圖表;

五镇草、Markdown文本

(一) 代碼

app = JupyterDash('Markdown')
text_notes = '''
### Dash和Markdown
Dash應(yīng)用程序可以用Markdown編寫瘤旨。Dash使用 Markdown 的CommonMark規(guī)范。

如果這是你對Markdown的第一次介紹存哲,請查看他們的[60 Second Markdown Tutorial](http://commonmark.org/help/)!
'''

app.layout = html.Div([
    dcc.Markdown(children=text_notes)
])

app

(二) 效果圖

(三) 說明

  1. 雖然Dash通過 dash_html_components 庫可以實(shí)現(xiàn)文本編寫察滑,但在HTML中編寫文本修肠,比較繁瑣,需要寫入大量的格式化文本饲化,推薦使用庫中的Markdown組件吗伤;
  2. Dash使用 MarkdownCommonMark規(guī)范;

六足淆、核心組件

(一) 代碼

app = JupyterDash('Core Components')
app.layout = html.Div([
    html.Label('下拉菜單'),
    dcc.Dropdown(
        options = [{'label': '北京', 'value': '北京'},
                   {'label': '天津', 'value': '天津'},
                   {'label': '上海', 'value': '上海'}],

        value = '北京'),
    
    html.Label('多選下拉菜單'),
    dcc.Dropdown(
        options = [{'label': '北京', 'value': '北京'},
                   {'label': '天津', 'value': '天津'},
                   {'label': '上海', 'value': '上海'}],
        value = ['北京', '上海'],
        multi = True),
    
    html.Label('單選鈕'),
    dcc.RadioItems(
        options = [{'label': '北京', 'value': '北京'},
                   {'label': '天津', 'value': '天津'},
                   {'label': '上海', 'value': '上海'}],
        value = '北京'),
    
    html.Label('多選框'),
    dcc.Checklist(
        options = [{'label': '北京', 'value': '北京'},
                   {'label': '天津', 'value': '天津'},
                   {'label': '上海', 'value': '上海'}],
        value=['北京', '上海']),
    
    html.Label('Text Input'),
    dcc.Input(value = '天津', type = 'text'),
    
    html.Label('文本輸入'),
    dcc.Slider(
        min = 0, max = 9, value = 5,
        marks = {i: '標(biāo)簽 {}'.format(i) if i == 1 else str(i) for i in range(1, 6)})
],style={'columnCount': 2})

app

(二) 效果圖

(三) 說明

  1. 本示例中缸浦,展示了下拉列表單選、下拉列表多選歹鱼、單選按鈕卜高、多選按鈕南片、文本輸入框庭敦、滑動(dòng)條;
  2. dash_core_components 包含一系列高級(jí)別的組件秧廉,如下拉列表、圖形嚼锄、Markdown文本等蔽豺;
  3. 與所有Dash組件一樣,這些組件都是聲明式的修陡,組件的關(guān)鍵字參數(shù)也一樣,每個(gè)選項(xiàng)都可以進(jìn)行配置宴杀;
  4. Dash核心組件庫中号杏,可以查看所有可用的組件斯棒。

七、小結(jié)

  1. Dash組件是聲明式的荣暮,在實(shí)例化關(guān)鍵字參數(shù)時(shí),可設(shè)置配置項(xiàng)护赊。通過調(diào)用help砾跃,可以查看Dash組件及其可用參數(shù)的更多信息;
help(dcc.Dropdown)
  1. 總結(jié)
  • 布局(layout)用來設(shè)置Dash應(yīng)用程序的樣式抽高,是結(jié)構(gòu)化的樹狀組件;
  • dash_html_components 庫提供了所有的HTML標(biāo)簽和關(guān)鍵字參數(shù)壁熄,用來設(shè)置HTML屬性,如style狸臣、className昌执、id等;
  • dash_core_components 庫生成了更高級(jí)別的組件仙蚜,如控件和圖形;
  • 具體參考官方文檔:dash_core_components委粉、dash_html_components
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贾节,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子栗涂,更是在濱河造成了極大的恐慌,老刑警劉巖角寸,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忿墅,死亡現(xiàn)場離奇詭異,居然都是意外死亡亿柑,警方通過查閱死者的電腦和手機(jī)棍弄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痕支,“玉大人蛮原,你說我怎么就攤上這事。” “怎么了板熊?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵察绷,是天一觀的道長。 經(jīng)常有香客問我容劳,道長闸度,這世上最難降的妖魔是什么竭贩? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任留量,我火速辦了婚禮哟冬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浩峡。我一直安慰自己,他們只是感情好缕粹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布纸淮。 她就那樣靜靜地躺著,像睡著了一般双戳。 火紅的嫁衣襯著肌膚如雪糜芳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天峭竣,我揣著相機(jī)與錄音晃虫,去河邊找鬼。 笑死扛吞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滥比。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼濒持,長吁一口氣:“原來是場噩夢啊……” “哼寺滚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起村视,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤蚁孔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勒虾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笛钝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年玻靡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了中贝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囤捻。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝎土,死狀恐怖绣否,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒜撮,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布取逾,位于F島的核電站,受9級(jí)特大地震影響砾隅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堕绩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一邑时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晶丘,春花似錦、人聲如沸沫浆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽本股。三九已至桐腌,卻和暖如春拄显,著一層夾襖步出監(jiān)牢的瞬間案站,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工承边, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舱禽,地道東北人恩沽。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像里伯,于是被迫代替她去往敵國和親城瞎。 傳聞我的和親對象是個(gè)殘疾皇子疾瓮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345