基本圖表
散佈圖(px.scatter)、折線圖(px.line)、長條圖(px.bar)與面積圖(px.area)是 Plotly Express 最常用的四種圖:散佈圖看兩個數值的關係,折線圖看隨時間的趨勢,長條圖比較類別之間的數量,面積圖看總量與組成隨時間的變化。本頁說明每種圖的常用參數與典型寫法。
散佈圖 px.scatter
散佈圖用點的位置呈現兩個數值變數的關係,再用 color、size、symbol 加入第三、四個變數。
import plotly.express as px
df = px.data.gapminder().query("year == 2007")
fig = px.scatter(df, x="gdpPercap", y="lifeExp",
size="pop", color="continent",
hover_name="country", log_x=True, size_max=55)
fig.show()
散佈圖常用參數:
| 參數 | 說明 |
|---|---|
size、size_max |
點的大小對應欄位,與最大像素(預設 20) |
symbol |
點的形狀對應類別欄位 |
text |
在點旁邊顯示文字;位置用 fig.update_traces(textposition="top center") 調整 |
trendline |
加趨勢線:"ols"、"lowess"、"rolling"、"ewm"、"expanding"(ols、lowess 需安裝 statsmodels),見 分布與統計圖 |
marginal_x、marginal_y |
邊際分布圖:"histogram"、"box"、"violin"、"rug" |
render_mode |
點很多(數萬點以上)時用 "webgl" 加速 |
資料點太多時
超過約一萬點時,散佈圖會變慢且點會互相重疊。可以設定 opacity=0.3 讓重疊處顏色變深,或改用 密度熱圖 px.density_heatmap。
折線圖 px.line
折線圖把點依 x 排序後連成線,適合時間序列。color 或 line_group 決定哪些點屬於同一條線。
import plotly.express as px
df = px.data.gapminder().query("continent == 'Oceania'")
fig = px.line(df, x="year", y="lifeExp", color="country", markers=True)
fig.show()
寬格式資料可以直接把多個欄位傳給 y:
折線圖常用參數:
| 參數 | 說明 |
|---|---|
markers=True |
在線上顯示資料點 |
line_dash |
依類別改變線型(實線、虛線) |
line_group |
分線但不改變顏色(例如每個國家一條線、顏色依洲別) |
line_shape |
"linear"(預設)、"spline"(平滑)、"hv"/"vh"(階梯) |
symbol |
依類別改變資料點形狀 |
日期欄位會自動使用時間軸;若日期是字串,先用 pd.to_datetime 轉換。時間序列常搭配範圍滑桿:
長條圖 px.bar
長條圖比較類別之間的數值大小。px.bar 不會自動加總:同一個類別有多筆資料時,會把每一筆疊成一段。
import plotly.express as px
df = px.data.tips()
fig = px.bar(df, x="day", y="total_bill", color="sex", barmode="group",
category_orders={"day": ["Thur", "Fri", "Sat", "Sun"]})
fig.show()
上圖每個長條其實由許多小段組成(每筆帳單一段)。想要乾淨的長條,有兩種做法:
# 做法一:先用 pandas 加總
summary = df.groupby(["day", "sex"], as_index=False)["total_bill"].sum()
px.bar(summary, x="day", y="total_bill", color="sex", barmode="group")
# 做法二:用 histogram 指定加總函式(自動 groupby)
px.histogram(df, x="day", y="total_bill", color="sex", barmode="group", histfunc="sum")
長條圖常用參數:
| 參數 | 說明 |
|---|---|
barmode |
"relative"(預設,堆疊)、"group"(並排)、"overlay"(重疊) |
orientation="h" |
水平長條;類別名稱很長時特別好讀 |
text_auto=True |
在長條上顯示數值;".2s"、".1%" 等 d3 格式字串可指定格式 |
pattern_shape |
依類別加上填充花紋,黑白列印時也能區分 |
error_y |
誤差線欄位 |
排序長條:
面積圖 px.area
面積圖是填滿下方區域、預設會堆疊的折線圖,適合看總量與各部分隨時間的變化。
import plotly.express as px
df = px.data.gapminder()
fig = px.area(df, x="year", y="pop", color="continent", line_group="country")
fig.show()
groupnorm="percent" 會把每個時間點的總和縮放為 100%,變成百分比堆疊面積圖,用來看「比例」而不是「總量」。
該選哪一種?
| 情境 | 建議 |
|---|---|
| 兩個連續數值有沒有關係 | scatter |
| 數值隨時間變化 | line |
| 幾個類別比大小 | bar(類別多或名稱長時用水平) |
| 總量隨時間變化,同時看組成 | area |
| 類別的「次數」而不是某欄位的值 | histogram(見 分布與統計圖) |
推薦影音
Bar Graph -- Python Plotly(Charming Data)
簡述:用 Plotly Express 從零做出長條圖,逐步示範堆疊與並排、水平方向、排序、文字標籤、樣式調整,最後做成動畫長條圖。對應本頁「長條圖」一節。
Scatter Plot -- Python Plotly (part 1)(Charming Data)
簡述:介紹 px.scatter 的主要參數,包括顏色、大小、標記符號、色階與懸停資訊。對應本頁「散佈圖」一節。