前言
寫程式跑出一堆數字之後,下一步常常是「把它畫成圖」。一張折線圖勝過一整欄的數據,而 Python 最經典的繪圖工具就是 matplotlib。
這篇我們用一個貫穿全文的情境來學:你在幫一家手搖飲料店整理上半年的營運數據。從安裝開始,一步一步把這些數字畫成看得懂的圖,最後解決一個幾乎每個台灣使用者都會踩到的坑:中文標題變成一格一格的方框(口口口)。假設你已經會 Python 的基本語法(變數、串列 list、print),其他的我們邊做邊講。
安裝 matplotlib
matplotlib 沒有內建在 Python 裡,要先用 pip 安裝。打開終端機(命令提示字元 / PowerShell / Terminal 都可以),輸入:
pip install matplotlib寫這篇時的最新穩定版是 3.11.0(2026 年 6 月釋出),需要 Python 3.11 以上。裝好之後,可以在 Python 裡確認一下版本:
import matplotlib
print(matplotlib.__version__) # 3.11.0只要沒有跳紅字,就代表安裝成功,可以開始畫圖了。
畫出第一張折線圖
先把店裡上半年(1 到 6 月)的營業額(單位:萬元)記成兩個串列,一個放月份、一個放對應的業績。matplotlib 最常用的介面叫做 pyplot,習慣上會把它簡寫成 plt:
import matplotlib.pyplot as plt
month = [1, 2, 3, 4, 5, 6]
sales = [42, 55, 51, 68, 82, 95]
plt.plot(month, sales)
plt.show()執行後會跳出一個視窗,裡面是一條有高有低、整體往上爬的折線——這就是這家店上半年的業績走勢,3 月小掉了一下,之後一路衝上來。這裡做的事情很單純:
plt.plot(month, sales):把month、sales兩個串列的數字,一組一組配成座標點(1,42)、(2,55)…再用線連起來。plt.show():把畫好的圖顯示出來。這行一定要有,不然圖畫好了卻不會跳出來。

到這裡,你已經畫出人生第一張 matplotlib 圖了。
加上圖表元素:標題與座標軸說明
現在這張圖有個問題:光看線條,別人根本不知道它在講什麼——這是月份還是日期?縱軸是萬元還是杯數?一張看得懂的圖,至少要有標題和座標軸說明。加三行就好:
import matplotlib.pyplot as plt
month = [1, 2, 3, 4, 5, 6]
sales = [42, 55, 51, 68, 82, 95]
plt.plot(month, sales)
plt.title("Sales Growth") # 圖表標題
plt.xlabel("Month") # x 軸說明
plt.ylabel("Sales") # y 軸說明
plt.show()三個新函式各司其職:
plt.title():整張圖最上方的標題。plt.xlabel():橫軸(x 軸)的說明文字。plt.ylabel():縱軸(y 軸)的說明文字。

一個小提醒:這幾行都要寫在 plt.show() 之前。show() 是「把目前為止畫好的東西顯示出來」,寫在它後面的設定會來不及生效。
多條線與圖例(legend)
一張圖常常不只一條線。這家店主打兩種茶——冰茶和熱茶,我們把兩者上半年的銷量畫在一起比一比。想多畫一條線,只要多呼叫一次 plt.plot() 就好。但這時候會有新問題:兩條線都畫出來了,怎麼知道哪條是哪條?答案是圖例(legend)。
作法分兩步:畫線時用 label 幫每條線取名字,最後再呼叫一次 plt.legend() 把名字顯示出來:
import matplotlib.pyplot as plt
month = [1, 2, 3, 4, 5, 6]
iced_tea = [20, 30, 45, 62, 80, 95]
hot_tea = [88, 75, 60, 42, 30, 22]
plt.plot(month, iced_tea, label="Iced Tea")
plt.plot(month, hot_tea, label="Hot Tea")
plt.title("Iced vs Hot Tea")
plt.xlabel("Month")
plt.ylabel("Cups")
plt.legend() # 顯示圖例,內容來自上面每條線的 label
plt.show()
圖的角落會出現一個小方塊,標明哪條線是哪種茶。這張圖還藏了一個小故事:兩條線在 3、4 月之間交叉——天氣一回暖,冰茶就反超熱茶。legend() 顯示的文字,就是各條線 label 給的名字——沒寫 label 的線不會出現在圖例裡。
換個圖表類型:長條圖與散佈圖
折線圖適合看「趨勢」,但資料的樣子百百種。matplotlib 換圖表類型很簡單,多半只是把 plot 換成別的函式,其他寫法幾乎一樣。
想比較各品項賣了幾杯,用長條圖 plt.bar():
import matplotlib.pyplot as plt
drinks = ["Bubble Tea", "Latte", "Green Tea", "Americano", "Juice"]
cups = [86, 64, 43, 58, 31]
plt.bar(drinks, cups)
plt.title("Drink Popularity")
plt.ylabel("Cups Sold")
plt.show()
想看兩組數值之間有沒有關聯(每個點各自獨立、不連線),用散佈圖 plt.scatter()。這裡把每天的「氣溫」和當天「冰飲銷量」湊成一對一對的點:
import matplotlib.pyplot as plt
temperature = [16, 18, 21, 23, 25, 27, 29, 31, 33, 35, 20, 28]
iced_sales = [22, 30, 28, 45, 52, 60, 78, 82, 95, 110, 38, 70]
plt.scatter(temperature, iced_sales)
plt.title("Temperature vs Iced Sales")
plt.xlabel("Temperature (C)")
plt.ylabel("Iced Drinks Sold")
plt.show()
點會像撒出去的豆子散在圖上。仔細看會發現它們往右上方聚——氣溫越高、冰飲賣得越多,這就是散佈圖最擅長呈現的「相關性」。另外有沒有發現?title、xlabel、ylabel、show() 這套「配件」在哪種圖都通用。學會一種,其他種類幾乎是照抄。
解決中文變方框、負號變框框
到目前為止,我們的標題都是英文。現在把第一張營業額折線圖的標題換成中文試試:
import matplotlib.pyplot as plt
month = [1, 2, 3, 4, 5, 6]
sales = [42, 55, 51, 68, 82, 95]
plt.plot(month, sales)
plt.title("每月營業額")
plt.xlabel("月份")
plt.show()
執行後你會發現:中文全部變成一格一格的方框(口口口)。這不是你的程式寫錯,而是 matplotlib 預設使用的字型不含中文字,畫不出來只好用方框代替。
解法是:告訴 matplotlib 改用一個有中文的字型。方法是設定 plt.rcParams(它是 matplotlib 存放全域設定的地方)裡的 font.sans-serif:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False兩行各做一件事:
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']:把預設字型換成「微軟正黑體」,這是 Windows 內建、含完整中文的字型,中文就畫得出來了。plt.rcParams['axes.unicode_minus'] = False:這行是另一個容易忽略的坑。換了中文字型後,座標軸上的負號(-)反而會變成方框。把axes.unicode_minus設成False,讓 matplotlib 用一般的減號字元,負數就正常了。
把設定放到最前面,整支程式就完整了:
import matplotlib.pyplot as plt
# 中文顯示設定(放在畫圖之前)
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False
month = [1, 2, 3, 4, 5, 6]
sales = [42, 55, 51, 68, 82, 95]
plt.plot(month, sales)
plt.title("每月營業額")
plt.xlabel("月份")
plt.ylabel("金額(萬元)")
plt.show()
這次中文標題、座標軸說明都正常顯示了。
如果你不是用 Windows,Microsoft JhengHei 這個字型不存在,中文一樣畫不出來。可以改填系統裡有的中文字型,或用跨平台的 Noto 系列。也可以一次列多個字型當備援,matplotlib 會從左到右挑第一個找得到的:
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei', 'Noto Sans CJK TC', 'PingFang TC']小結
這篇用一家飲料店的上半年數據,走完了 matplotlib 的入門路線:
- 用
pip install matplotlib安裝,plt.plot()+plt.show()畫出第一張營業額折線圖。 - 用
title/xlabel/ylabel/legend幫圖表加上看得懂的說明,而且這套配件在折線圖、長條圖、散佈圖都通用。 - 折線看趨勢、長條比多寡、散佈看相關,同一批數字換個圖就換個角度。
- 用
plt.rcParams['font.sans-serif']換中文字型解決方框問題,再用plt.rcParams['axes.unicode_minus'] = False順手修好負號。
「中文變方框」幾乎是每個人的第一道關卡,把上面那兩行設定記下來,之後每次畫含中文的圖,開頭貼上去就一勞永逸了。