長格式與寬格式資料
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 版本。
相關頁面
- 上一步:Figure 結構
- 下一步:共通參數全攻略
- 官方說明:Plotly Express Wide-Form Support