Matplotlib 快速入门
編程派微信號:codingpy
看完此文如果覺得不錯,不妨點擊文末廣告支持一下
昨天推出的免費贈書活動還在進行,首先感謝大家的積極參與!看了眼前五的朋友,比剛開始時的變化還是挺大的啊,昨天沒看到的朋友不要錯過了哦。傳送門 --》?福利 | 推薦一本美亞排名第一的Python入門教材。
回到今天這篇文章,主題是 Python 庫中大名鼎鼎的繪圖圖 Matplotlib 。當初我也是受了這個庫的吸引,開始學習 Python 的。給大家看幾張用 Matplotlib 生成的圖:(首圖也是用 Matplotlib 繪制的)
本文的原作者是 Jamal Moir,是 Python 科學計算系列的第一篇文章,或許有人已經翻譯過了,但我覺得我們 Python 翻譯組的譯文質量還是不錯的。希望對喜歡 Python 的各位朋友有幫助。
本文譯者 linkmyth,校對 EarlGrey@編程派。linkmyth 是同濟大學的在讀碩士,主攻web開發(fā)、機器學習等方向。
以下是原文正文:
數(shù)據(jù)的處理、分析和可視化已經成為 Python 近年來最重要的應用之一。這種現(xiàn)象又進一步引出“大數(shù)據(jù)”分析等類似的話題,而大數(shù)據(jù)分析在人們所能預見的諸多領域內都有廣泛應用,這其中就包含筆者個人感興趣的機器學習。
Python 在處理數(shù)據(jù)、分析數(shù)據(jù)以及數(shù)據(jù)可視化方面擁有很多功能強大的工具,這也是 Python 在科學領域中能夠迅速發(fā)展的一個主要原因。
在接下來的一系列文章中,我們將介紹 Python 科學計算中涉及的主要的庫,并且學習如何使用它們處理數(shù)據(jù)以滿足我們的需求。但是我們并非只是停留在快速寫出模板代碼來使用這些庫的層面上,我們還會了解這些庫背后的數(shù)學知識,以幫助我們更好地理解庫的運行原理。
首先,我們將從一個功能非常強大的庫 Matplotlib 開始介紹,在后面的文章中也會一直用到這個庫。
什么是 Matplotlib?
簡單來說,Matplotlib 是 Python 的一個繪圖庫。它包含了大量的工具,你可以使用這些工具創(chuàng)建各種圖形,包括簡單的散點圖,正弦曲線,甚至是三維圖形。Python 科學計算社區(qū)經常使用它完成數(shù)據(jù)可視化的工作。
你可以在他們的網(wǎng)站上了解到更多 Matplotlib 背后的設計思想,但是我強烈建議你先瀏覽一下他們的圖庫,體會一下這個庫的各種神奇功能。
畫一個簡單的圖形
首先我們要畫一條在 [0, 2pi] 上的正弦曲線。讀者應該會注意到我們在這里使用了 Numpy 庫,但是即便你沒有使用過這個庫也不用擔心,在后面的文章中我們也會介紹到 Numpy 庫。
import matplotlib.pyplot as pltimport numpy as np
以上這些就是我們將要用到的導入模塊。在我的上一篇文章(以及另一篇文章)中都提到過?from x import *?是一種糟糕的導入方式。我們不想在程序里重復書寫?matplotlib.pyplot?和?numpy,這種書寫方式過于冗長,因此我們采用了上面的折中寫法。
# 簡單的繪圖x = np.linspace(0, 2 * np.pi, 50) plt.plot(x, np.sin(x))
# 如果沒有第一個參數(shù) x,圖形的 x 坐標默認為數(shù)組的索引
plt.show() # 顯示圖形
上面的代碼將畫出一個簡單的正弦曲線。np.linspace(0, 2 * np.pi, 50)?這段代碼將會生成一個包含 50 個元素的數(shù)組,這 50 個元素均勻的分布在 [0, 2pi] 的區(qū)間上。
plot?命令以一種簡潔優(yōu)雅的方式創(chuàng)建了圖形。提醒一下,如果沒有第一個參數(shù) x,圖形的 x 軸坐標將不再是 0 到 2pi,而應該是數(shù)組的索引范圍。
最后一行代碼?`plt.show()?將圖形顯示出來,如果沒有這行代碼圖像就不會顯示。
運行代碼后應該會類似得到下面的圖形:
在一張圖上繪制兩個數(shù)據(jù)集
大多數(shù)時候讀者可能更想在一張圖上繪制多個數(shù)據(jù)集。用 Matplotlib 也可以輕松實現(xiàn)這一點。
x = np.linspace(0, 2 * np.pi, 50) plt.plot(x, np.sin(x),x, np.sin(2 * x)) plt.show()上面的代碼同時繪制了表示函數(shù) sin(x) 和 sin(2x) 的圖形。這段代碼和前面繪制一個數(shù)據(jù)集的代碼幾乎完全相同,只有一點例外,這段代碼在調用?plt.plot()?的時候多傳入了一個數(shù)據(jù)集,并用逗號與第一個數(shù)據(jù)集分隔開。
最后你會得到類似于下面包含兩條曲線的圖形:
自定義圖形的外觀
當在同一個圖形上展示多個數(shù)據(jù)集時,通過改變線條的外觀來區(qū)分不同的數(shù)據(jù)集變得非常必要。
# 自定義曲線的外觀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'?代表包含實心點標記的實線,'--'?代表虛線。其他的參數(shù)需要讀者自己去嘗試,這也是學習 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) # (行,列,活躍區(qū))
plt.plot(x, np.sin(x), 'r') plt.subplot(2, 1, 2) plt.plot(x, np.cos(x), 'g') plt.show()
使用子圖只需要一個額外的步驟,就可以像前面的例子一樣繪制數(shù)據(jù)集。即在調用?plot()?函數(shù)之前需要先調用?subplot()?函數(shù)。該函數(shù)的第一個參數(shù)代表子圖的總行數(shù),第二個參數(shù)代表子圖的總列數(shù),第三個參數(shù)代表活躍區(qū)域。
活躍區(qū)域代表當前子圖所在繪圖區(qū)域,繪圖區(qū)域是按從左至右,從上至下的順序編號。例如在 4×4 的方格上,活躍區(qū)域 6 在方格上的坐標為 (2, 2)。
最終你會得到類似下面的圖形:
簡單的散點圖
散點圖是一堆離散點的集合。用 Matplotlib 畫散點圖也同樣非常簡單。
# 簡單的散點圖x = np.linspace(0, 2 * np.pi, 50) y = np.sin(x) plt.scatter(x,y) plt.show()
正如上面代碼所示,你只需要調用?scatter()?函數(shù)并傳入兩個分別代表 x 坐標和 y 坐標的數(shù)組。注意,我們通過?plot?命令并將線的樣式設置為?'bo'?也可以實現(xiàn)同樣的效果。
最后你會得到類似下面的無線圖形:
彩色映射散點圖
另一種你可能用到的圖形是彩色映射散點圖。這里我們會根據(jù)數(shù)據(jù)的大小給每個點賦予不同的顏色和大小,并在圖中添加一個顏色欄。
# 彩色映射散點圖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),原因是我們繪圖的數(shù)據(jù)都是隨機產生的。
同前面一樣我們用到了?scatter()?函數(shù),但是這次我們傳入了另外的兩個參數(shù),分別為所繪點的大小和顏色。通過這種方式使得圖上點的大小和顏色根據(jù)數(shù)據(jù)的大小產生變化。
然后我們用?colorbar()?函數(shù)添加了一個顏色欄。
最后你會得到類似于下面的彩色散點圖:
直方圖
直方圖是另一種常見的圖形,也可以通過幾行代碼創(chuàng)建出來。
# 直方圖x = np.random.randn(1000) plt.hist(x, 50) plt.show()
直方圖是 Matplotlib 中最簡單的圖形之一。你只需要給?hist()?函數(shù)傳入一個包含數(shù)據(jù)的數(shù)組。第二個參數(shù)代表數(shù)據(jù)容器的個數(shù)。數(shù)據(jù)容器代表不同的值的間隔,并用來包含我們的數(shù)據(jù)。數(shù)據(jù)容器越多,圖形上的數(shù)據(jù)條就越多。
最終你會得到類似下面的直方圖:
標題,標簽和圖例
當需要快速創(chuàng)建圖形時,你可能不需要為圖形添加標簽。但是當構建需要展示的圖形時,你就需要添加標題,標簽和圖例。
# 添加標題,坐標軸標記和圖例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()?函數(shù)中添加命名參數(shù)?'label'?并賦予該參數(shù)相應的標簽。然后調用?legend()?函數(shù)就會在我們的圖形中添加圖例。
接下來我們只需要調用函數(shù)?title(),xlabel()?和?ylabel()?就可以為圖形添加標題和標簽。
你會得到類似于下面這張擁有標題、標簽和圖例的圖形:
以上內容應該足夠幫助讀者開始使用 Matplotlib 和 Python 實現(xiàn)數(shù)據(jù)可視化,但是這些內容并不全面。我強烈建議讀者親自嘗試使用這個工具,筆者也是通過這種方式掌握了這個工具。畫一些圖形,改變樣式并使用子圖功能,然后你就會很快掌握 Matplotlib 的使用方式。
這是一篇是關于如何使用 Matplotlib 和 Python 完成數(shù)據(jù)可視化的文章,也是 Python 科學計算系列文章中的第一篇。我希望讀者能從中有所收獲,并且對 Matplotlib 庫更加熟悉。
不要忘記分享和關注
請記得分享這篇文章讓更多的人看到它!另外,記得訂閱這個博客的郵件列表,關注我的Twitter并在Google+上添加我,這樣你就不會錯過任何有價值的文章!
我會閱讀所有的評論,所以無論你有什么想要說的,或者是想要分享的,甚至是問題之類的,都可以在下面留言。
歡迎轉發(fā)至朋友圈。如無特殊注明,本公號所發(fā)文章均為原創(chuàng)或編譯,如需轉載,請聯(lián)系「編程派」獲得授權。
加群交流 Python 技術問題,請先閱讀群規(guī)(點擊藍色字體),然后加編程派主頁君為好友并說明愿意遵守群規(guī)。
【近期優(yōu)秀教程推薦】
踐行這5條原則,構建優(yōu)秀的Python包
好用!在 Notebook 中使用 Sublime Text 快捷鍵
如何測試代碼覆蓋率:coverage.py 簡介
Jupyter Notebook 快速入門(上)
Jupyter Notebook 快速入門(下)
掃碼關注編程派,獲取最新教程及資源推送
↓↓↓ 點擊閱讀原文,查看更多Python教程?
↓↓↓ 另外,歡迎點擊廣告,你的每次點擊都會成為以后的活動福利基金
總結
以上是生活随笔為你收集整理的Matplotlib 快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 看完这篇文章之后,终于明白了编译到底怎么
- 下一篇: 使用Python进行科学计算:NumPy
