3D、極座標與進階圖表
除了常見的二維圖表,Plotly Express 還提供多維度與特殊座標的圖:3D 散佈圖與折線圖、極座標圖(雷達圖、風花圖)、三元圖、散佈矩陣、平行座標圖、影像與矩陣熱圖(px.imshow),以及甘特圖(px.timeline)。這些圖的參數仍遵循 共通參數 的規則,只是位置參數換了名字。
3D 散佈圖 px.scatter_3d
用 x、y、z 三個欄位決定位置,可拖曳旋轉、滾輪縮放:
import plotly.express as px
df = px.data.iris()
fig = px.scatter_3d(df, x="sepal_length", y="sepal_width", z="petal_width",
color="species")
fig.show()
px.line_3d 是 3D 折線版本。3D 圖在螢幕上互動時很直觀,但印成靜態圖時容易誤判深度;只有三個變數都重要時再使用,否則用 color 或 size 表示第三個變數通常更清楚。
極座標圖 px.scatter_polar、px.line_polar、px.bar_polar
極座標使用 r(半徑)與 theta(角度)。風向、方位、週期性資料特別適合:
import plotly.express as px
df = px.data.wind()
fig = px.bar_polar(df, r="frequency", theta="direction", color="strength",
color_discrete_sequence=px.colors.sequential.Plasma_r)
fig.show()
雷達圖(radar chart)是 px.line_polar 加上 line_close=True:
import pandas as pd
skills = pd.DataFrame({
"能力": ["Python", "統計", "視覺化", "SQL", "溝通"],
"分數": [5, 3, 4, 4, 3],
})
fig = px.line_polar(skills, r="分數", theta="能力", line_close=True)
fig.update_traces(fill="toself")
fig.show()
三元圖 px.scatter_ternary
三元圖用於三個加總固定(例如 100%)的比例,例如土壤成分、三方得票率:
df = px.data.election()
px.scatter_ternary(df, a="Joly", b="Coderre", c="Bergeron",
color="winner", size="total", hover_name="district")
散佈矩陣 px.scatter_matrix
一次畫出多個數值欄位兩兩之間的散佈圖,是探索資料時快速找相關性的工具:
df = px.data.iris()
fig = px.scatter_matrix(df,
dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"],
color="species")
fig.update_traces(diagonal_visible=False)
fig.show()
在任一格框選資料點,其他格中同樣的點也會被標示出來(linked brushing)。
平行座標圖與平行類別圖
px.parallel_coordinates:每個數值欄位是一條垂直軸,每筆資料是一條折線;可在軸上拖曳選取範圍來篩選。px.parallel_categories:類別欄位版本,以色帶寬度表示筆數。
df = px.data.iris()
px.parallel_coordinates(df, color="species_id",
dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"],
color_continuous_scale=px.colors.diverging.Tealrose)
tips = px.data.tips()
px.parallel_categories(tips, dimensions=["sex", "smoker", "day"], color="size")
影像與矩陣熱圖 px.imshow
px.imshow 顯示二維陣列(矩陣、相關係數表)或圖片(RGB 陣列)。最常見的用途是相關係數熱圖:
import plotly.express as px
df = px.data.iris()
corr = df.drop(columns=["species", "species_id"]).corr()
fig = px.imshow(corr, text_auto=".2f", color_continuous_scale="RdBu_r",
zmin=-1, zmax=1, aspect="auto")
fig.show()
| 參數 | 說明 |
|---|---|
text_auto |
在格子中顯示數值;可給格式字串如 ".2f" |
zmin、zmax |
色階範圍;相關係數固定為 -1~1 才好比較 |
aspect |
"equal"(正方格,預設)或 "auto"(填滿畫面) |
facet_col、animation_frame |
三維陣列可以拆成多張或做成動畫(例如影片的每一幀) |
px.imshow 也能直接顯示圖片:px.imshow(skimage.data.astronaut()),或用 PIL.Image.open() 讀取的影像。
甘特圖 px.timeline
甘特圖顯示每個任務的開始與結束時間:
import pandas as pd
import plotly.express as px
tasks = pd.DataFrame([
dict(任務="需求訪談", 開始="2026-01-05", 結束="2026-01-16", 負責人="Amy"),
dict(任務="系統設計", 開始="2026-01-12", 結束="2026-02-06", 負責人="Ben"),
dict(任務="開發", 開始="2026-02-02", 結束="2026-03-27", 負責人="Ben"),
dict(任務="測試", 開始="2026-03-16", 結束="2026-04-10", 負責人="Amy"),
])
fig = px.timeline(tasks, x_start="開始", x_end="結束", y="任務", color="負責人")
fig.update_yaxes(autorange="reversed") # 讓第一個任務在最上面
fig.show()
推薦影音
Create 3D Scatter Plot -- Python Plotly(Charming Data)
簡述:在 25 行以內建立 3D 散佈圖,接著加入動畫並存成 HTML 分享,最後討論什麼情況適合或不適合用 3D 圖。對應本頁「3D 散佈圖」一節。