編程派微信號:codingpyweb
看完此文若是以爲不錯,不妨點擊文末廣告支持一下編程
昨天推出的免費贈書活動還在進行,首先感謝你們的積極參與!看了眼前五的朋友,比剛開始時的變化仍是挺大的啊,昨天沒看到的朋友不要錯過了哦。傳送門 --》 福利 | 推薦一本美亞排名第一的Python入門教材。數組
回到今天這篇文章,主題是 Python 庫中大名鼎鼎的繪圖圖 Matplotlib 。當初我也是受了這個庫的吸引,開始學習 Python 的。給你們看幾張用 Matplotlib 生成的圖:(首圖也是用 Matplotlib 繪製的)微信
本文的原做者是 Jamal Moir,是 Python 科學計算系列的第一篇文章,或許有人已經翻譯過了,但我以爲咱們 Python 翻譯組的譯文質量仍是不錯的。但願對喜歡 Python 的各位朋友有幫助。dom
本文譯者 linkmyth,校對 EarlGrey@編程派。linkmyth 是同濟大學的在讀碩士,主攻web開發、機器學習等方向。機器學習
如下是原文正文:ide
數據的處理、分析和可視化已經成爲 Python 近年來最重要的應用之一。這種現象又進一步引出「大數據」分析等相似的話題,而大數據分析在人們所能預見的諸多領域內都有普遍應用,這其中就包含筆者我的感興趣的機器學習。
Python 在處理數據、分析數據以及數據可視化方面擁有不少功能強大的工具,這也是 Python 在科學領域中可以迅速發展的一個主要緣由。函數
在接下來的一系列文章中,咱們將介紹 Python 科學計算中涉及的主要的庫,而且學習如何使用它們處理數據以知足咱們的需求。可是咱們並不是只是停留在快速寫出模板代碼來使用這些庫的層面上,咱們還會了解這些庫背後的數學知識,以幫助咱們更好地理解庫的運行原理。工具
首先,咱們將從一個功能很是強大的庫 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 庫更加熟悉。