[筆記] Matplotlib 使用上的一些建議
可以說是在 Python 語言的世界裡面,最具代表性的圖表繪製工具了(a.k.a 資料視覺化)
推薦閱讀 Anatomy Of Matplotlib
matplotlib / AnatomyOfMatplotlib
https://github.com/matplotlib/AnatomyOfMatplotlib
Anatomy of Matplotlib — tutorial developed for the SciPy conference
非常詳盡的解說,搭配非常充分的舉例,閱讀起來幾乎沒有負擔。而且使用 Jupyter Notebook 內嵌文章的方式,連手動複製範例程式碼的時間都省下來了,只要一個 Ctrl
Enter
就可以立刻看到效果,真的非常方便。
以下的文章就是以《Anatomy Of Matplotlib》為基礎整理的,目的只是讓自己可以更快速的找到需要的資訊。
一個 Matplotlib 圖表的組成

Figure
是整個圖表最外層的部份,上圖中淡藍色的部份全部都是Axes
是圖表的「圖」的部份,上圖中白色底,藍色線的部份。注意這邊的 axes 是 axis 的複數形,因為一張圖可以有多個軸(維度)Subplot
有的時候你會看見一張figure
中包含了複數個圖表,就是透過它達成的XAxis
和YAxis
則分別是 X軸 和 Y軸
注:一個 Axes
可以繪製不只一次圖形(請用圖層的觀念來想像),可以利用這個方式來繪製更為複雜的圖形。
範例圖使用的程式碼:
# x-軸數值設為 -50 ~ 50 x = np.arange(-50, 50) # 設定背景為藍色 (R=0, G=0, B=0, Alpha=0.1) fig = plt.figure(facecolor=(0, 0, 1, .1)) # 繪製圖表 plt.plot(x**2) # 顯示 plt.show()
API: pyplot.figure
請多多使用 plt.subplots
在畫相對簡單的圖的時候,我們總是會傾向直接使用 plt.plot
,這點並沒有錯。不過我相信,會閱讀這篇文章的你,一定不是只打算畫一張 Excel 圖表這麼簡單。
為了方便理解,讓我們先把上面那張圖表以 plt.subplots
的方式重新繪製一次:
x = np.arange(-50, 50) fig, ax = plt.subplots() fig.set(facecolor=(0, 0, 1, .1)) ax.plot(x, x**2) ax.set(title='Simple Plot', xlabel='X-Axis', ylabel='Y-Axis') plt.show()
不過這次加入了表標題、XY軸等說明文字

中文變方框怎麼辦
解決方法參考自:How to change fonts in matplotlib (python)? – Stack Overflow
簡單的作法: 使用 fontname
引數
# 如果你使用 pyplot 界面 plt.title("標題", fontname='Noto Sans CJK JP') plt.ylabel("X軸", fontname='Noto Sans CJK JP') plt.xlabel("Y軸", fontname='Noto Sans CJK JP') # 如果你使用 ax / subplots ax.set_title("標題", fontname='Noto Sans CJK JP') ax.set_xlabel("X軸", fontname='Noto Sans CJK JP') ax.set_ylabel("Y軸", fontname='Noto Sans CJK JP')
結果:當然是成功的,不過每次都需要指定 fontname
實在有點麻煩,不是嗎?

建議的作法: 使用 matplotlibrc
官方文件: Customizing Matplotlib with style sheets and rcParams
plt.rcParams["font.family"] = 'sans-serif' plt.rcParams["font.sans-serif"] = ['Noto Sans CJK JP'] fig, ax = plt.subplots() x = np.arange(-50, 50) ax.plot(x, x**2) ax.set(title='標題', xlabel='X軸', ylabel='Y軸') plt.show()
注: 字型名稱怎麼找
請翻自行快取的 json
檔
- Windows:
C:\Users\lasts.matplotlib\fontList.json
- Linux:
./.cache/matplotlib/fontlist-v330.json
或者你可以用底下的 Code 幫你列(部份字型餵 FontProperties
的時候可能會出錯)
import matplotlib.font_manager flist = matplotlib.font_manager.get_fontconfig_fonts() for font in flist: fname = matplotlib.font_manager.FontProperties(fname=font).get_name() print(f'{fname}: {font}')
另外,Linux 使用者可以使用 fc-list
列出已安裝的字型:
fc-list | grep -E 'Noto .+ TC'
後記
Matplotlib 是個相當強大的工具,代表它會有很多東西是我們沒辦法一次就上手的。不過這也沒什麼關係,畢竟我們也不見得通通都會用到,只要能夠找到一個比較好理解的寫法,配合官網上的範例,我相信大家都可以學的很快。
Myabe~ 我很快就會又需要筆記自己學到的東西,到時候再說囉~下次見!