跳轉至

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

自我挑戰練習

自我挑戰練習用 Plotly Express 內建資料集設計了十道題目,從基本圖表一路練到分面、動畫、地圖與客製化,涵蓋本站「Plotly Express 詳解」各頁的重點。每題先自己寫,再展開參考解答比對;參考解答只是其中一種寫法。

開始之前,先在 Notebook 第一格載入套件:

import plotly.express as px
import pandas as pd

Open In Colab

基礎題

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)的網頁。