建立 2026-10-13
更新 2026-10-13
自我挑戰練習
自我挑戰練習用 Plotly Express 內建資料集設計了十道題目,從基本圖表一路練到分面、動畫、地圖與客製化,涵蓋本站「Plotly Express 詳解」各頁的重點。每題先自己寫,再展開參考解答比對;參考解答只是其中一種寫法。
開始之前,先在 Notebook 第一格載入套件:
import plotly.express as px
import pandas as pd

基礎題
1. 各洲國家數
用 gapminder 2007 年的資料,畫出每個洲有幾個國家的長條圖,由多到少排序。
參考解答
df = px.data.gapminder().query("year == 2007")
fig = px.histogram(df, x="continent") # histogram 會自動計數
fig.update_xaxes(categoryorder="total descending")
fig.show()
2. 台灣平均壽命的變化
用 gapminder 畫出 Taiwan、Japan、Korea, Rep. 三國平均壽命隨年份變化的折線圖,加上資料點標記。
參考解答
df = px.data.gapminder()
df = df[df["country"].isin(["Taiwan", "Japan", "Korea, Rep."])]
px.line(df, x="year", y="lifeExp", color="country", markers=True,
labels={"year": "年份", "lifeExp": "平均壽命", "country": "國家"})
3. 小費比例的分布
在 tips 新增一欄「小費比例」(tip / total_bill),畫出直方圖,並以 time 上色、重疊顯示。
參考解答
df = px.data.tips()
df["tip_pct"] = df["tip"] / df["total_bill"]
fig = px.histogram(df, x="tip_pct", color="time", barmode="overlay",
opacity=0.6, nbins=40)
fig.update_xaxes(tickformat=".0%")
fig.show()
4. 長寬格式轉換
px.data.medals_wide() 是寬格式。把它轉成長格式後,畫出各國金銀銅牌數的並排長條圖。
參考解答
wide = px.data.medals_wide()
long = wide.melt(id_vars="nation", var_name="medal", value_name="count")
px.bar(long, x="nation", y="count", color="medal", barmode="group",
color_discrete_map={"gold": "gold", "silver": "silver", "bronze": "#cd7f32"})
進階題
5. 箱形圖比較
用 tips 畫出不同星期(依 Thur、Fri、Sat、Sun 排序)的帳單金額箱形圖,並依是否吸菸分色。
參考解答
df = px.data.tips()
px.box(df, x="day", y="total_bill", color="smoker",
category_orders={"day": ["Thur", "Fri", "Sat", "Sun"]})
6. 分面散佈圖加趨勢線
用 tips 畫帳單與小費的散佈圖,依 sex 分面(左右兩張),並加上 OLS 趨勢線。
參考解答
df = px.data.tips()
px.scatter(df, x="total_bill", y="tip", facet_col="sex", trendline="ols")
7. 亞洲人口樹狀圖
用 gapminder 2007 年亞洲國家的資料,畫出以人口為大小、人均 GDP 為顏色的樹狀圖。
參考解答
df = px.data.gapminder().query("year == 2007 and continent == 'Asia'")
px.treemap(df, path=["country"], values="pop", color="gdpPercap",
color_continuous_scale="Blues")
8. 世界人均 GDP 動畫地圖
用 gapminder 畫出各國人均 GDP 的面量圖,並依年份做成動畫。記得固定色階範圍,並使用對數尺度讓差異更明顯。
參考解答
import numpy as np
df = px.data.gapminder()
df["log_gdp"] = np.log10(df["gdpPercap"])
px.choropleth(df, locations="iso_alpha", color="log_gdp", hover_name="country",
animation_frame="year", range_color=[2.5, 5],
color_continuous_scale="Viridis",
labels={"log_gdp": "log10(人均 GDP)"})
9. 相關係數熱圖
計算 iris 四個數值欄位的相關係數,用 px.imshow 畫成熱圖,格子內顯示兩位小數,色階固定在 -1 到 1。
參考解答
df = px.data.iris()
corr = df[["sepal_length", "sepal_width", "petal_length", "petal_width"]].corr()
px.imshow(corr, text_auto=".2f", zmin=-1, zmax=1, color_continuous_scale="RdBu_r")
10. 客製化並輸出
把第 2 題的圖改成 plotly_white 模板、標題置中、圖例放在下方,Y 軸標題改成「平均壽命(歲)」,最後存成 life.html 與 life.png。
參考解答
df = px.data.gapminder()
df = df[df["country"].isin(["Taiwan", "Japan", "Korea, Rep."])]
fig = px.line(df, x="year", y="lifeExp", color="country", markers=True,
template="plotly_white", title="東亞三國平均壽命")
fig.update_layout(title_x=0.5, legend=dict(orientation="h", y=-0.2, title=""))
fig.update_yaxes(title_text="平均壽命(歲)")
fig.write_html("life.html")
fig.write_image("life.png", scale=2) # 需安裝 kaleido
延伸挑戰
- 找一份自己有興趣的開放資料(例如政府資料開放平臺),用 pandas 讀進來,選三種最能回答問題的圖表畫出來。
- 用 Dash 把第 8 題做成可以用下拉選單切換指標(
lifeExp、pop、gdpPercap)的網頁。