我們在做一些做一些資料分析的時候,經常面對的是一堆完全無法理解的數字數據;就算你看得懂,你老闆也未必想要聽你慢慢解釋這些數據到底代表什麼東西。因此,如果我們可以做出來一個圖表,把這些數據做視覺化(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