跳轉至

建立 2026-10-13 更新 2026-10-13

長格式與寬格式資料

Plotly Express 最適合「長格式」(long-form,又稱 tidy data)的資料:每一列是一筆觀測,每一欄是一個變數。資料是長格式時,任何欄位都能直接指定給 x、y、color、facet_col 等參數;資料是「寬格式」(wide-form)時,Plotly Express 雖然也能畫,但能用的參數較少。學會用 pandas 的 melt 在兩種格式間轉換,是使用 Plotly Express 最重要的前置功夫。

長格式與寬格式長什麼樣子?

同一份「三家公司各年營收」資料,兩種寫法:

year A 公司 B 公司 C 公司
2023 10 8 12
2024 12 9 15

每個公司一欄,欄名本身就是資料(公司名稱)。

year company revenue
2023 A 公司 10
2023 B 公司 8
2023 C 公司 12
2024 A 公司 12
2024 B 公司 9
2024 C 公司 15

「公司」變成一個欄位,每一列只有一個數值。

長格式的好處是:company 是一個普通欄位,所以可以指定給 color="company"、facet_col="company"、animation_frame="company",用法完全一致。

用 melt 把寬格式轉成長格式

import pandas as pd
import plotly.express as px

wide = pd.DataFrame({
    "year": [2023, 2024],
    "A 公司": [10, 12],
    "B 公司": [8, 9],
    "C 公司": [12, 15],
})

long = wide.melt(id_vars="year", var_name="company", value_name="revenue")
px.bar(long, x="year", y="revenue", color="company", barmode="group")

melt 的三個參數:

  • id_vars:保持不動的欄位(這裡是 year)。
  • var_name:原本的欄名要放進哪個新欄位(這裡叫 company)。
  • value_name:原本儲存格的數值要放進哪個新欄位(這裡叫 revenue)。

反方向(長轉寬)用 pivot:long.pivot(index="year", columns="company", values="revenue")。

Plotly Express 也能直接畫寬格式

px.scatter、px.line、px.area、px.bar、px.histogram、px.box、px.violin、px.strip、px.funnel、px.ecdf、px.density_heatmap、px.density_contour 接受寬格式:把多個欄位名稱以 list 傳給 y(或 x),Plotly Express 會在內部自動 melt,並把欄名放進名為 variable 的欄位、數值放進 value 欄位。

import plotly.express as px

df = px.data.stocks()  # 寬格式:date, GOOG, AAPL, AMZN, FB, NFLX, MSFT
fig = px.line(df, x="date", y=["GOOG", "AAPL", "MSFT"])
fig.update_layout(legend_title_text="股票代號", yaxis_title="相對價格")
fig.show()

寬格式時,color、facet_col 等參數可以使用 "variable" 這個自動產生的名稱,例如 facet_col="variable" 讓每個欄位各自一張小圖。

寬格式的限制

寬格式只適用上面列出的函式;px.pie、px.sunburst、px.choropleth 等函式仍需要長格式。資料欄位一多、需要同時用到 color 與 facet_col 不同變數時,先 melt 成長格式最不容易出錯。

不用 DataFrame 也可以

快速測試時,可以直接傳 list、NumPy 陣列或 pandas Series:

import plotly.express as px

px.scatter(x=[1, 2, 3, 4], y=[10, 11, 12, 13], labels={"x": "時間", "y": "數值"})

沒有欄位名稱時,座標軸會顯示 x、y,可以用 labels 參數改成中文。

支援哪些 DataFrame?

Plotly 6 起透過 Narwhals 支援多種 DataFrame 函式庫:pandas、Polars、PyArrow、Modin、cuDF 都能直接傳給 Plotly Express,不必先轉成 pandas。內建資料集 px.data.*() 也可以用 return_type="polars" 取得 Polars 版本。

相關頁面