十分鐘入門Matplotlib
地址:http://codingpy.com/article/a-quick-intro-to-matplotlib/
什麼是 Matplotlib?
簡單來說,Matplotlib 是 Python 的一個繪相簿。它包含了大量的工具,你可以使用這些工具建立各種圖形,包括簡單的散點圖,正弦曲線,甚至是三維圖形。Python 科學計算社群經常使用它完成資料視覺化的工作。
你可以在他們的網站上了解到更多 Matplotlib 背後的設計思想,但是我強烈建議你先瀏覽一下他們的相簿,體會一下這個庫的各種神奇功能。
畫一個簡單的圖形
首先我們要畫一條在 [0, 2pi] 上的正弦曲線。讀者應該會注意到我們在這裡使用了 Numpy 庫,但是即便你沒有使用過這個庫也不用擔心,在後面的文章中我們也會介紹到 Numpy 庫。
import matplotlib.pyplot as plt import numpy as np
以上這些就是我們將要用到的匯入模組。在我的上一篇文章(以及另一篇文章)中都提到過 from
x import *
是一種糟糕的匯入方式。我們不想在程式裡重複書寫 matplotlib.pyplot
和 numpy
,這種書寫方式過於冗長,因此我們採用了上面的折中寫法。
# 簡單的繪圖 x = np.linspace(0, 2 * np.pi, 50) plt.plot(x, np.sin(x)) # 如果沒有第一個引數 x,圖形的 x 座標預設為陣列的索引 plt.show() # 顯示圖形
上面的程式碼將畫出一個簡單的正弦曲線。np.linspace(0, 2 * np.pi, 50)
這段程式碼將會生成一個包含 50 個元素的陣列,這
50 個元素均勻的分佈在 [0, 2pi] 的區間上。
plot
命令以一種簡潔優雅的方式建立了圖形。提醒一下,如果沒有第一個引數 x,圖形的 x 軸座標將不再是 0 到 2pi,而應該是陣列的索引範圍。
最後一行程式碼 `plt.show()
將圖形顯示出來,如果沒有這行程式碼影象就不會顯示。
執行程式碼後應該會類似得到下面的圖形:
在一張圖上繪製兩個資料集
大多數時候讀者可能更想在一張圖上繪製多個數據集。用 Matplotlib 也可以輕鬆實現這一點。
x = np.linspace(0, 2 * np.pi, 50) plt.plot(x, np.sin(x), x, np.sin(2 * x)) plt.show()
上面的程式碼同時繪製了表示函式 sin(x) 和 sin(2x) 的圖形。這段程式碼和前面繪製一個數據集的程式碼幾乎完全相同,只有一點例外,這段程式碼在呼叫 plt.plot()
的時候多傳入了一個數據集,並用逗號與第一個資料集分隔開。
最後你會得到類似於下面包含兩條曲線的圖形:
自定義圖形的外觀
當在同一個圖形上展示多個數據集時,通過改變線條的外觀來區分不同的資料集變得非常必要。
# 自定義曲線的外觀 x = np.linspace(0, 2 * np.pi, 50) plt.plot(x, np.sin(x), 'r-o', x, np.cos(x), 'g--') plt.show()
上述程式碼展示了兩種不同的曲線樣式:'r-o'
和 'g--'
。字母
'r' 和 'g' 代表線條的顏色,後面的符號代表線和點標記的型別。例如 '-o'
代表包含實心點標記的實線,'--'
代表虛線。其他的引數需要讀者自己去嘗試,這也是學習
Matplotlib 最好的方式。
顏色: 藍色 - 'b' 綠色 - 'g' 紅色 - 'r' 青色 - 'c' 品紅 - 'm' 黃色 - 'y' 黑色 - 'k'('b'代表藍色,所以這裡用黑色的最後一個字母) 白色 - 'w'
線: 直線 - '-' 虛線 - '--' 點線 - ':' 點劃線 - '-.'
常用點標記 點 - '.' 畫素 - ',' 圓 - 'o' 方形 - 's' 三角形 - '^' 更多點標記樣式點選這裡
最後你會得到類似下面的圖形:
使用子圖
使用子圖可以在一個視窗繪製多張圖。
# 使用子圖 x = np.linspace(0, 2 * np.pi, 50) plt.subplot(2, 1, 1) # (行,列,活躍區) plt.plot(x, np.sin(x), 'r') plt.subplot(2, 1, 2) plt.plot(x, np.cos(x), 'g') plt.show()
使用子圖只需要一個額外的步驟,就可以像前面的例子一樣繪製資料集。即在呼叫 plot()
函式之前需要先呼叫 subplot()
函式。該函式的第一個引數代表子圖的總行數,第二個引數代表子圖的總列數,第三個引數代表活躍區域。
活躍區域代表當前子圖所在繪圖區域,繪圖區域是按從左至右,從上至下的順序編號。例如在 4×4 的方格上,活躍區域 6 在方格上的座標為 (2, 2)。
最終你會得到類似下面的圖形:
簡單的散點圖
散點圖是一堆離散點的集合。用 Matplotlib 畫散點圖也同樣非常簡單。
# 簡單的散點圖 x = np.linspace(0, 2 * np.pi, 50) y = np.sin(x) plt.scatter(x,y) plt.show()
正如上面程式碼所示,你只需要呼叫 scatter()
函式並傳入兩個分別代表 x 座標和 y 座標的陣列。注意,我們通過 plot
命令並將線的樣式設定為 'bo'
也可以實現同樣的效果。
最後你會得到類似下面的無線圖形:
彩色對映散點圖
另一種你可能用到的圖形是彩色對映散點圖。這裡我們會根據資料的大小給每個點賦予不同的顏色和大小,並在圖中新增一個顏色欄。
# 彩色對映散點圖 x = np.random.rand(1000) y = np.random.rand(1000) size = np.random.rand(1000) * 50 colour = np.random.rand(1000) plt.scatter(x, y, size, colour) plt.colorbar() plt.show()
上面的程式碼大量的用到了 np.random.rand(1000)
,原因是我們繪圖的資料都是隨機產生的。
同前面一樣我們用到了 scatter()
函式,但是這次我們傳入了另外的兩個引數,分別為所繪點的大小和顏色。通過這種方式使得圖上點的大小和顏色根據資料的大小產生變化。
然後我們用 colorbar()
函式添加了一個顏色欄。
最後你會得到類似於下面的彩色散點圖:
直方圖
直方圖是另一種常見的圖形,也可以通過幾行程式碼創建出來。
# 直方圖 x = np.random.randn(1000) plt.hist(x, 50) plt.show()
直方圖是 Matplotlib 中最簡單的圖形之一。你只需要給 hist()
函式傳入一個包含資料的陣列。第二個引數代表資料容器的個數。資料容器代表不同的值的間隔,並用來包含我們的資料。資料容器越多,圖形上的資料條就越多。
最終你會得到類似下面的直方圖:
標題,標籤和圖例
當需要快速建立圖形時,你可能不需要為圖形新增標籤。但是當構建需要展示的圖形時,你就需要新增標題,標籤和圖例。
# 新增標題,座標軸標記和圖例 x = np.linspace(0, 2 * np.pi, 50) plt.plot(x, np.sin(x), 'r-x', label='Sin(x)') plt.plot(x, np.cos(x), 'g-^', label='Cos(x)') plt.legend() # 展示圖例 plt.xlabel('Rads') # 給 x 軸新增標籤 plt.ylabel('Amplitude') # 給 y 軸新增標籤 plt.title('Sin and Cos Waves') # 新增圖形標題 plt.show()
為了給圖形新增圖例,我們需要在 plot()
函式中新增命名引數 'label'
並賦予該引數相應的標籤。然後呼叫 legend()
函式就會在我們的圖形中新增圖例。
接下來我們只需要呼叫函式 title()
,xlabel()
和 ylabel()
就可以為圖形新增標題和標籤。
你會得到類似於下面這張擁有標題、標籤和圖例的圖形:
以上內容應該足夠幫助讀者開始使用 Matplotlib 和 Python 實現資料視覺化,但是這些內容並不全面。我強烈建議讀者親自嘗試使用這個工具,筆者也是通過這種方式掌握了這個工具。畫一些圖形,改變樣式並使用子圖功能,然後你就會很快掌握 Matplotlib 的使用方式。
這是一篇是關於如何使用 Matplotlib 和 Python 完成資料視覺化的文章,也是 Python 科學計算系列文章中的第一篇。我希望讀者能從中有所收穫,並且對 Matplotlib 庫更加熟悉。