[Python]Dash 全面入門教學:從 0 到打造互動式資料分析應用

更新 發佈閱讀 14 分鐘

Dash 全面入門教學:從 0 到打造互動式資料分析應用

Dash 是由 Plotly 所開發的 Python Web 應用框架,專為資料分析與視覺化設計。你可以用 Dash 快速打造具有豐富互動功能的網頁應用,而不需要學習前端技術如 JavaScript、HTML 或 CSS。

📦 安裝 Dash

在開始之前,請確認你已安裝 Python 3.7+。

pip install dash

也建議安裝 pandasplotly

pip install pandas plotly

🏗 Dash 架構概觀

Dash 應用的基本組成有三大部分:

  1. Layout:定義使用者介面(UI),使用 Dash HTML 與 Core Components。
  2. Callback:設定互動邏輯(例如按鈕點擊、下拉選單變更)。
  3. Server 啟動點:透過 Flask 啟動本地或雲端應用。

📋 基礎範例:互動式圖表

import dash
from dash import html, dcc, Input, Output
import plotly.express as px
import pandas as pd

# 建立簡單資料
df = px.data.gapminder()

# 初始化應用
app = dash.Dash(__name__)

# Layout 介面
app.layout = html.Div([
html.H1("🌍 世界人口與壽命分析"),
dcc.Dropdown(
id='country-dropdown',
options=[{'label': c, 'value': c} for c in df['country'].unique()],
value='Taiwan'
),
dcc.Graph(id='life-exp-vs-year')
])

# 設定 callback
@app.callback(
Output('life-exp-vs-year', 'figure'),
Input('country-dropdown', 'value')
)
def update_graph(selected_country):
filtered_df = df[df['country'] == selected_country]
fig = px.line(filtered_df, x='year', y='lifeExp',
title=f'{selected_country} 壽命變化趨勢',
markers=True)
return fig

# 啟動 server
if __name__ == '__main__':
app.run(debug=True)

點擊網頁的部分,即可開啟

vocus|新世代的創作平台
vocus|新世代的創作平台

🔧 元件說明與進階技巧

🔹 Layout 元件介紹

Dash 提供兩大元件類別:

  • dash.html: HTML 元素,例如 html.Div, html.H1, html.Button
  • dash.dcc: Dash Core Components,例如 dcc.Graph, dcc.Input, dcc.Dropdown
html.Div([
html.Label("輸入名字:"),
dcc.Input(id='input-name', type='text'),
html.Button("送出", id='submit-btn')
])

🔄 Callback 設定與資料綁定

Dash 使用 回呼函數(callback)來建立互動。

基本結構

@app.callback(
Output('輸出元件ID', '屬性'),
Input('輸入元件ID', '屬性')
)
def 處理函數(輸入參數):
return 回傳值

支援多輸入輸出

@app.callback(
[Output('out1', 'children'), Output('out2', 'style')],
[Input('in1', 'value'), Input('in2', 'n_clicks')]
)
def multi_output(v1, v2):
...
return val1, style2

📊 整合 Pandas + Plotly

Dash 通常搭配 pandas 處理資料,搭配 plotly.express 建立互動圖表。

import pandas as pd
import plotly.express as px

df = pd.read_csv('sales.csv') # 假設你有一個銷售資料表

fig = px.bar(df, x='產品', y='銷售額', color='地區')

將此圖整合進 Dash:

dcc.Graph(figure=fig)

🧪 加入更多互動:多圖表 + 輸入框

html.Div([
dcc.Input(id='input-year', type='number', value=2007),
dcc.Graph(id='graph-gdp'),
dcc.Graph(id='graph-life')
])

@app.callback(
[Output('graph-gdp', 'figure'),
Output('graph-life', 'figure')],
Input('input-year', 'value')
)
def update_graphs(year):
dff = df[df['year'] == year]
fig1 = px.bar(dff, x='country', y='gdpPercap', title='GDP per Capita')
fig2 = px.bar(dff, x='country', y='lifeExp', title='Life Expectancy')
return fig1, fig2

📁 檔案上傳功能

dcc.Upload(
id='upload-data',
children=html.Button('上傳 CSV'),
multiple=False
)

@app.callback(Output('output-data', 'children'),
Input('upload-data', 'contents'))
def handle_upload(contents):
if contents:
content_type, content_string = contents.split(',')
decoded = base64.b64decode(content_string)
df = pd.read_csv(io.StringIO(decoded.decode('utf-8')))
return html.Div([dcc.Graph(figure=px.line(df))]

程式範例整合進去

import dash
from dash import html, dcc, Input, Output, State
import plotly.express as px
import pandas as pd
import base64
import io

# 原始資料
df = px.data.gapminder()

# 初始化 Dash 應用
app = dash.Dash(__name__)

# Layout 設定
app.layout = html.Div([
html.H1("🌍 世界人口與壽命分析"),

dcc.Dropdown(
id='country-dropdown',
options=[{'label': c, 'value': c} for c in df['country'].unique()],
value='Taiwan',
style={'width': '50%'}
),

html.Br(),

dcc.Upload(
id='upload-data',
children=html.Button('📤 上傳 CSV 檔案', style={'fontSize': '16px'}),
multiple=False
),

html.Div(id='upload-message', style={'margin': '10px', 'color': 'green'}),

dcc.Graph(id='life-exp-vs-year')
])

# 使用者上傳 CSV 資料後更新圖表
@app.callback(
Output('life-exp-vs-year', 'figure'),
Output('upload-message', 'children'),
Input('upload-data', 'contents'),
State('upload-data', 'filename'),
State('country-dropdown', 'value')
)
def handle_upload(contents, filename, selected_country):
if contents:
content_type, content_string = contents.split(',')
decoded = base64.b64decode(content_string)
try:
# 嘗試讀取 CSV 資料
df_uploaded = pd.read_csv(io.StringIO(decoded.decode('utf-8')))
fig = px.line(df_uploaded, x=df_uploaded.columns[0], y=df_uploaded.columns[1],
title=f'自訂 CSV: {df_uploaded.columns[1]}{df_uploaded.columns[0]} 的變化')
return fig, f"✅ 已成功載入 {filename}"
except Exception as e:
return dash.no_update, f"❌ 上傳失敗:{str(e)}"

# 如果沒上傳,就顯示預設圖(根據選取國家)
filtered_df = df[df['country'] == selected_country]
fig = px.line(filtered_df, x='year', y='lifeExp',
title=f'{selected_country} 壽命變化趨勢',
markers=True)
return fig, ""

# 預設圖表:當選取國家時(且沒有上傳新檔)更新圖表
@app.callback(
Output('country-dropdown', 'value'),
Input('country-dropdown', 'value')
)
def preserve_dropdown(value):
return value # 確保 Dropdown 維持最新選取值(避免被 callback 覆蓋)
# 啟動應用
if __name__ == '__main__':
app.run(debug=True)
vocus|新世代的創作平台

📦 專案結構建議

dash_app/

├── app.py # 主應用程式
├── assets/ # 放 CSS, 圖片等前端資源
│ └── style.css
├── data/ # 放資料檔案
├── components/ # 拆分的 UI 或 callback 模組(可選)



留言
avatar-img
螃蟹_crab的沙龍
169會員
322內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
你可能也想看
Thumbnail
動態規劃Dynamic Programming其實是 一種泛用的演算法思考方式與演算法建構框架。 動態規劃並不拘束於只能解課本上特定的的範例題。 只要我們能找出DP狀態定義、DP遞迴結構、初始條件(終止條件),就能適用動態規劃來解題,以數學的形式表達,並且在紙筆上或者電腦上、計算機上計算
Thumbnail
動態規劃Dynamic Programming其實是 一種泛用的演算法思考方式與演算法建構框架。 動態規劃並不拘束於只能解課本上特定的的範例題。 只要我們能找出DP狀態定義、DP遞迴結構、初始條件(終止條件),就能適用動態規劃來解題,以數學的形式表達,並且在紙筆上或者電腦上、計算機上計算
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
Thumbnail
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News