回文章列表
Python7 分鐘閱讀2026年6月28日

Python matplotlib 入門:畫出第一張圖,並解決中文變方框的問題

#Python#matplotlib#資料視覺化#中文顯示#新手

文章目錄

前言

寫程式跑出一堆數字之後,下一步常常是「把它畫成圖」。一張折線圖勝過一整欄的數據,而 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 順手修好負號。

「中文變方框」幾乎是每個人的第一道關卡,把上面那兩行設定記下來,之後每次畫含中文的圖,開頭貼上去就一勞永逸了。

相關課程

Python 資料視覺化

從 Matplotlib 的第一張折線圖出發,逐步掌握長條圖、直方圖、圓餅圖、散佈圖與多子圖排版,並學會用 pandas 內建繪圖與 seaborn 畫出兼具美感與統計資訊的圖表,最終完成一份綜合實戰的資料視覺化分析儀表板。

查看課程內容