我們在做一些做一些資料分析的時候,經常面對的是一堆完全無法理解的數字數據;就算你看得懂,你老闆也未必想要聽你慢慢解釋這些數據到底代表什麼東西。因此,如果我們可以做出來一個圖表,把這些數據做視覺化(data visualization)。這個時候就算你老闆不知道你在工三小,至少他可以一眼看得出來你有做一些數據整理。Matplotlib 就是在 Python 裡最常拿來做數據視覺化的套件;我們甚至可以用它來畫出一個 3D 的圖表哦~

環境安裝

pip install matplotlib

跟上一門 Pandas 的一樣,我們會在 notebook 上面做練習。這樣圖表可以直接在 code block 下面呈現出來,比較好看。我們主要都會用 matplotlib 裡面的 pyplot submodule,並把它匿名為 plt。之後會看到一個比較奇怪的指令 %matplotlib inline,這種 % 的指令是叫 magic function,只會在這種 .ipynb 系列的環境出現。而這個指令是讓 matplotlib 的圖表可以直接在環境裡顯示出來。

import matplotlib.pyplot as plt
%matplotlib inline

plt.plot()

我們首先來畫一個線型圖表。首先我們要透過 plt.plot() 方法宣告一條線,每次呼叫一次 plt.plot() 我們的圖表就會多一條線。並且傳入 x 軸和 y 軸的值,matplotlib 就會把那條線畫出來了。如果我們要對線做格式編輯,我們可以在 plt.plot() 的方法裡傳入color,marker,linestyle 的參數,或者也可以透過內建的 shorthand 來編輯線條;否則將以預設的藍色實線呈現。

# Syntax: plt.plot(x,y,format,label)
plt.plot([1,2,3,4],[1,9,13,15],label="data-1")          # 預設的地一條線是藍色實線
plt.plot([1,2,3,4],[2,10,12,13],"r*--",label="data-2")  # r = red; * = 星型標識; -- = 虛線
plt.title("My First Graph")
plt.xlabel("Label X")
plt.ylabel("Label Y")
plt.grid()              # 讓圖表有線條方便觀看
plt.legend()            # 顯示線條描述
plt.show()

plt.subplots()

那我們如想要把兩個圖表並排比較,我們可以透過 plt.subplots() 來畫出一個圖表矩陣。我們在範例裡面就宣告了一個plt.subplots(),並且將圖表的行列 (2,2) 傳入這個 method。它將回傳一個圖表 fig (object) 和圖表的軸 axs (list)。只要將圖表在相對應的軸 plot() 出來就好了~

x = np.arange(0, 10, 0.1)               # x 軸的值為 0 - 10, 並且每一步為 0.1, 這樣圖才會長得比較順
y = np.sin(x)                           # y = sin(x)

fig, axs = plt.subplots(2, 2)           # 宣告一個 2 × 2 的圖表,subplot() 方法回傳的值為一個圖 fig, 和相對應的軸 axis (x-row,y-col)
axs[0, 0].plot(x, y, color='red')
axs[0, 0].set_title('Axis [0,0]')
axs[0, 1].plot(x, y, color='orange')
axs[0, 1].set_title('Axis [0,1]')
axs[1, 0].plot(x, -y, color='blue')
axs[1, 0].set_title('Axis [1,0]')
axs[1, 1].plot(x, -y, color='green')
axs[1, 1].set_title('Axis [1,1]')

# 將 x 軸和 y 軸的 label 命名
for ax in axs.flat:
    ax.set(xlabel='x-label', ylabel='y-label')

# 只將圖表 x 軸和 y 軸最外層的 label 顯示出來
for ax in axs.flat:
    ax.label_outer()

plt.show()

其他的表

當然,除了線型表以外,我們還可以做其他的圖表;例如:直方圖(histogram)、條形圖(bar)、圓餅圖(pie)、散點圖(scatter)等... 基本上只要知道如何呼叫圖表相對應的 API 就好了~

np.random.seed(85310810)      # 亂碼初始化
data = np.random.randn(2, 25) # 宣告一個 2 × 25 的亂數矩陣

fig, axs = plt.subplots(2, 2, figsize=(5, 5))
axs[0, 0].hist(data[0])                # 直方圖 hist()
axs[1, 0].scatter(data[0], data[1])    # 散點圖 scatter()
axs[0, 1].pie([2,4,8,16])              # 圓餅圖 pie()
axs[1, 1].hist2d(data[0], data[1])     # 二維直方圖 hist2d()

plt.show()

當然,當你的圖越複雜,你就需要花更多時間寫更多 code。但是還有一個叫 seaborn 的套件大家可以去參考看看。

範例程式碼外送(限高大GSuite賬號)

Reference:

Sample Plots in Matplotlib
Machine Learning Plus - Matplotlib Tutorial

Leave a Reply

Your email address will not be published. Required fields are marked *