Python Streamlit 資料視覺化儀表板入門教學 2026:從零打造互動分析工具
什麼是 Streamlit?為什麼值得學?
我第一次接觸 Streamlit 是在 2022 年,當時為了展示一個機器學習模型的預測結果,苦苦掙扎了兩週試圖用 Flask 搭配前端框架。後來同事推薦我試試 Streamlit,結果兩個小時內就做出了能互動的展示介面——那個衝擊感讓我印象深刻。
Streamlit 是一個開源的 Python 框架,專為資料科學家與機器學習工程師設計,讓你不需要懂 HTML、CSS 或 JavaScript,就能用純 Python 快速建立互動式 Web 應用程式。它的核心哲學是:用最少的程式碼,做最有力的展示。
2026 年的 Streamlit 已相當成熟,社群龐大,官方整合了更多 AI/ML 展示元件,對於想把 Python 分析成果「視覺化展示」給非技術人員看的工程師來說,幾乎是不二選擇。
如果你也在做資料分析工作,搭配 DuckDB Python分析 來做本地大型資料集查詢,再用 Streamlit 呈現結果,是目前我認為效率最高的組合之一。
安裝與環境設定
Streamlit 的安裝非常簡單,推薦搭配虛擬環境使用:
# 建立虛擬環境
python -m venv streamlit-env
source streamlit-env/bin/activate
# 安裝 Streamlit 與常用套件
pip install streamlit pandas numpy plotly matplotlib
建立第一個測試檔案:
import streamlit as st
st.title("我的第一個 Streamlit 應用")
st.write("Hello, Streamlit!這是 2026 年最值得學的 Python 工具。")
在終端機執行 streamlit run app.py,瀏覽器會自動開啟 http://localhost:8501。這個「儲存即更新」的開發體驗,是 Streamlit 最讓人上癮的地方之一。
核心元件介紹
Streamlit 的 API 設計極度直覺,所有元件都以 st. 開頭呼叫。以下介紹最常用的幾類元件。
圖表元件
Streamlit 內建多種圖表呈現方式,也支援 Plotly、Altair、Matplotlib 等第三方函式庫:
import streamlit as st
import pandas as pd
import plotly.express as px
df = pd.DataFrame({
"月份": ["1月", "2月", "3月", "4月", "5月", "6月"],
"銷售額": [120000, 145000, 132000, 178000, 165000, 210000]
})
fig = px.line(df, x="月份", y="銷售額", title="2026 上半年銷售趨勢")
st.plotly_chart(fig, use_container_width=True)
st.dataframe(df, use_container_width=True)
個人偏好用 plotly_chart,因為 Plotly 圖表本身支援互動(hover、縮放),展示給客戶看特別有說服力。
側邊欄與互動元件
Streamlit 真正強大的地方在於互動控制元件,讓儀表板能動態篩選資料:
with st.sidebar:
st.header("篩選條件")
selected_year = st.selectbox("選擇年份", [2024, 2025, 2026], index=2)
min_sales = st.slider("最低銷售額門檻", 0, 500000, 100000, 10000)
categories = st.multiselect(
"產品類別",
["電子產品", "服飾", "食品", "家居"],
default=["電子產品", "服飾"]
)
每當使用者操作這些元件,Streamlit 就會自動重新執行整個腳本,頁面即時更新——這就是它的響應式設計核心。
實戰:打造完整銷售分析儀表板
把上面學到的元件組合起來,做一個完整的銷售分析儀表板:
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
st.set_page_config(page_title="銷售分析儀表板 2026", layout="wide")
@st.cache_data
def load_data():
np.random.seed(42)
dates = pd.date_range("2026-01-01", "2026-06-30", freq="D")
return pd.DataFrame({
"date": dates,
"sales": np.random.normal(15000, 3000, len(dates)).clip(5000),
"category": np.random.choice(["電子", "服飾", "食品", "家居"], len(dates)),
"region": np.random.choice(["北部", "中部", "南部", "東部"], len(dates))
})
df = load_data()
with st.sidebar:
st.header("⚙️ 篩選設定")
regions = st.multiselect("地區", df["region"].unique().tolist(), default=df["region"].unique().tolist())
cats = st.multiselect("類別", df["category"].unique().tolist(), default=df["category"].unique().tolist())
fdf = df[df["region"].isin(regions) & df["category"].isin(cats)]
st.title("📊 2026 上半年銷售分析儀表板")
col1, col2, col3 = st.columns(3)
col1.metric("總銷售額", f"${fdf['sales'].sum():,.0f}", delta="+12.5%")
col2.metric("日均銷售", f"${fdf['sales'].mean():,.0f}", delta="+5.3%")
col3.metric("最高單日", f"${fdf['sales'].max():,.0f}")
daily = fdf.groupby("date")["sales"].sum().reset_index()
fig = px.line(daily, x="date", y="sales", title="每日銷售趨勢")
st.plotly_chart(fig, use_container_width=True)
with st.expander("📋 查看原始資料"):
st.dataframe(fdf, use_container_width=True)
csv = fdf.to_csv(index=False).encode("utf-8")
st.download_button("下載 CSV", data=csv, file_name="sales_2026.csv")
@st.cache_data 裝飾器是效能優化的關鍵,確保資料只在第一次載入時執行,後續互動不會重新讀取,在處理大型資料集時能顯著提升響應速度。
Streamlit vs Dash vs Gradio 比較
選工具之前,先了解三者定位差異:
| 特性 | Streamlit | Dash | Gradio |
|---|---|---|---|
| 學習曲線 | 極低 | 中高 | 極低 |
| 自訂彈性 | 中 | 高 | 低 |
| ML 展示 | 良好 | 可行 | 最佳 |
| 資料儀表板 | 最佳 | 最佳 | 勉強 |
| 企業級功能 | 有限 | Dash Enterprise | 有限 |
我的建議:資料科學內部工具和快速 PoC 展示,選 Streamlit;需要複雜 callback 邏輯和企業部署,選 Dash;純 AI/ML 模型展示,選 Gradio。三者並不互斥,根據受眾選擇不同展示工具是務實的做法。
部署方式:Streamlit Cloud 與 Docker
方案一:Streamlit Community Cloud(免費)
- 把程式碼推上 GitHub,確保
requirements.txt完整 - 前往 share.streamlit.io 登入 GitHub 帳號
- 點擊「New app」,選擇倉庫與主程式檔案
- 在 Secrets 設定環境變數(如 API 金鑰)
- 點擊部署,約 2-3 分鐘後取得公開網址
方案二:Docker 容器部署
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8501
ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
Docker 部署讓你的 Streamlit 應用可以和其他後端服務整合,例如搭配 FastAPI WebSocket 做即時資料推送,讓儀表板能顯示真正的即時串流資料。
實用技巧與常見踩坑
1. Session State 管理狀態
Streamlit 每次互動都重新執行腳本,若需要跨互動保存狀態,使用 st.session_state:
if "count" not in st.session_state:
st.session_state.count = 0
if st.button("點擊計數"):
st.session_state.count += 1
st.write(f"已點擊 {st.session_state.count} 次")
2. 多頁面應用架構
將不同功能拆分到 pages/ 資料夾,Streamlit 會自動生成側邊欄導航:
your_app/
├── app.py
└── pages/
├── 1_銷售分析.py
├── 2_客戶分析.py
└── 3_預測模型.py
3. 搭配資料驗證工具
處理使用者上傳的 CSV 或 API 資料時,搭配 Pydantic v2 做資料驗證,能有效防止格式錯誤導致儀表板崩潰,特別是在接收外部資料來源時非常實用。
4. 常見踩坑
- 忘記
@st.cache_data:每次互動都重新載入大型資料,效能極差 - 在 sidebar 外呼叫 widget 卻期望它出現在 sidebar:必須在
with st.sidebar:區塊內 - 多人同時使用時的 session 隔離問題:
session_state是獨立的,但全域變數是共享的 - 部署時忘記更新
requirements.txt:務必執行pip freeze > requirements.txt
結語
Streamlit 之所以在 2026 年依然是資料視覺化儀表板的首選之一,在於它完美解決了「我有分析結果,但不知道怎麼讓別人看到」這個痛點。幾十行 Python 就能做出專業感十足的互動儀表板,對沒有前端背景的資料工程師來說,真的是救星。
從最簡單的 st.write() 到完整的多頁面應用,Streamlit 的學習路徑非常平滑。建議從小專案開始,把日常分析的 Jupyter Notebook 轉換成 Streamlit 應用,是最有效率的練習方式。
如果在儀表板中需要處理大量資料,記得配合 DuckDB Python分析 來加速查詢效能,兩者搭配使用能讓你的分析工具在本地處理 GB 級資料集時依然保持流暢。下一步,嘗試將儀表板部署到 Streamlit Cloud,讓你的分析成果真正被看見。
繼續閱讀
Python Matplotlib 資料視覺化入門教學:用圖表說故事的完整指南
資料分析做完了,但老闆看不懂你的數字?Matplotlib 是 Python 最經典的繪圖套件,這篇教你從零畫出各種圖表,讓數據自己說話。
相關文章
你可能也喜歡
探索其他領域的精選好文