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

環境安裝

<span class="hljs-attr">pip</span> <span class="hljs-string">install matplotlib</span>

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

<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
%matplotlib inline

plt.plot()

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

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

plt.subplots()

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

x = np.arange(<span class="hljs-number">0</span>, <span class="hljs-number">10</span>, <span class="hljs-number">0.1</span>)               <span class="hljs-comment"># x 軸的值為 0 - 10, 並且每一步為 0.1, 這樣圖才會長得比較順</span>
y = np.sin(x)                           <span class="hljs-comment"># y = sin(x)</span>

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

<span class="hljs-comment"># 將 x 軸和 y 軸的 label 命名</span>
<span class="hljs-keyword">for</span> ax <span class="hljs-keyword">in</span> axs.flat:
    ax.set(xlabel=<span class="hljs-string">'x-label'</span>, ylabel=<span class="hljs-string">'y-label'</span>)

<span class="hljs-comment"># 只將圖表 x 軸和 y 軸最外層的 label 顯示出來</span>
<span class="hljs-keyword">for</span> ax <span class="hljs-keyword">in</span> axs.flat:
    ax.label_outer()

plt.show()

其他的表

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

np.random.seed(<span class="hljs-number">85310810</span>)      <span class="hljs-comment"># 亂碼初始化</span>
data = np.random.randn(<span class="hljs-number">2</span>, <span class="hljs-number">25</span>) <span class="hljs-comment"># 宣告一個 2 × 25 的亂數矩陣</span>

fig, axs = plt.subplots(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, figsize=(<span class="hljs-number">5</span>, <span class="hljs-number">5</span>))
axs[<span class="hljs-number">0</span>, <span class="hljs-number">0</span>].hist(data[<span class="hljs-number">0</span>])                <span class="hljs-comment"># 直方圖 hist()</span>
axs[<span class="hljs-number">1</span>, <span class="hljs-number">0</span>].scatter(data[<span class="hljs-number">0</span>], data[<span class="hljs-number">1</span>])    <span class="hljs-comment"># 散點圖 scatter()</span>
axs[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>].pie([<span class="hljs-number">2</span>,<span class="hljs-number">4</span>,<span class="hljs-number">8</span>,<span class="hljs-number">16</span>])              <span class="hljs-comment"># 圓餅圖 pie()</span>
axs[<span class="hljs-number">1</span>, <span class="hljs-number">1</span>].hist2d(data[<span class="hljs-number">0</span>], data[<span class="hljs-number">1</span>])     <span class="hljs-comment"># 二維直方圖 hist2d()</span>

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 *