個人前面兩篇文章介紹了 Nimpy ,Pandas 。今天來介紹一下Matplotlib。html
簡單來講,Matplotlib 是 Python 的一個繪圖庫。它包含了大量的工具,你可使用這些工具建立各類圖形,包括簡單的散點圖,正弦曲線,甚至是三維圖形。Python 科學計算社區常用它完成數據可視化的工做。api
你能夠在他們的網站上了解到更多 Matplotlib 背後的設計思想,可是我強烈建議你先瀏覽一下他們的圖庫,體會一下這個庫的各類神奇功能。數組
In [1]: import matplotlib.pyplot as plt In [2]: import numpy as np In [3]: x = np.linspace(0, 2 * np.pi, 50) In [6]: plt.plot(x, np.sin(x)) Out[6]: [<matplotlib.lines.Line2D at 0x1dcdc98a748>] In [7]: plt.show()
上面的代碼將畫出一個簡單的正弦曲線。np.linspace(0, 2 * np.pi, 50)這段代碼將會生成一個包含 50 個元素的數組,這 50 個元素均勻的分佈在 [0, 2pi] 的區間上。dom
plot命令以一種簡潔優雅的方式建立了圖形。提醒一下,若是沒有第一個參數 x,圖形的 x 軸座標將再也不是 0 到 2pi,而應該是數組的索引範圍。函數
最後一行代碼 plt.show()將圖形顯示出來,若是沒有這行代碼圖像就不會顯示。工具
運行代碼後應該會相似獲得下面的圖形:學習
大多數時候讀者可能更想在一張圖上繪製多個數據集。用 Matplotlib 也能夠輕鬆實現這一點。網站
In [15]: x = np.linspace(0, 2 * np.pi, 50) In [16]: plt.plot(x, np.sin(x), x, np.sin(2*x)) Out[16]: [<matplotlib.lines.Line2D at 0x1dcdb38a080>, <matplotlib.lines.Line2D at 0x1dcdb38a1d0>] In [17]: plt.show()
上面的代碼同時繪製了表示函數 sin(x) 和 sin(2x) 的圖形。這段代碼和前面繪製一個數據集的代碼幾乎徹底相同,只有一點例外,這段代碼在調用plt.plot()的時候多傳入了一個數據集,並用逗號與第一個數據集分隔開。spa
最後你會獲得相似於下面包含兩條曲線的圖形:設計
當在同一個圖形上展現多個數據集時,經過改變線條的外觀來區分不一樣的數據集變得很是必要。
In [18]: x = np.linspace(0, 2*np.pi, 50) In [19]: plt.plot(x, np.sin(x), 'r-o', x, np.cos(x), 'g--') Out[19]: [<matplotlib.lines.Line2D at 0x1dcdb695898>, <matplotlib.lines.Line2D at 0x1dcdb695a20>] In [20]: plt.show()
上述代碼展現了兩種不一樣的曲線樣式:'r-o' 和 'g--'。字母 'r' 和 'g' 表明線條的顏色,後面的符號表明線和點標記的類型。例如 '-o' 表明包含實心點標記的實線,'--' 表明虛線。其餘的參數須要讀者本身去嘗試,這也是學習 Matplotlib 最好的方式。
顏色: 藍色 - 'b' 綠色 - 'g' 紅色 - 'r' 青色 - 'c' 品紅 - 'm' 黃色 - 'y' 黑色 - 'k'('b'表明藍色,因此這裏用黑色的最後一個字母) 白色 - 'w' 線: 直線 - '-' 虛線 - '--' 點線 - ':' 點劃線 - '-.' 經常使用點標記 點 - '.' 像素 - ',' 圓 - 'o' 方形 - 's' 三角形 - '^'
更多點標記樣式點擊這裏
最後你會獲得相似下面的圖形:
使用子圖能夠在一個窗口繪製多張圖。
In [21]: x = np.linspace(0, 2*np.pi, 50) In [22]: plt.subplot(2, 1, 1) # (行,列,活躍區) Out[22]: <matplotlib.axes._subplots.AxesSubplot at 0x1dcdb6ba978> In [23]: plt.plot(x, np.sin(x), 'r') Out[23]: [<matplotlib.lines.Line2D at 0x1dcdb7316d8>] In [24]: plt.subplot(2, 1, 2) Out[24]: <matplotlib.axes._subplots.AxesSubplot at 0x1dcdb731ba8> In [25]: plt.plot(x, np.cos(x), 'g') Out[25]: [<matplotlib.lines.Line2D at 0x1dcdb77bfd0>] In [26]: plt.show()
使用子圖只須要一個額外的步驟,就能夠像前面的例子同樣繪製數據集。即在調用 plot() 函數以前須要先調用 subplot() 函數。該函數的第一個參數表明子圖的總行數,第二個參數表明子圖的總列數,第三個參數表明活躍區域。
活躍區域表明當前子圖所在繪圖區域,繪圖區域是按從左至右,從上至下的順序編號。例如在 4×4 的方格上,活躍區域 6 在方格上的座標爲 (2, 2)。
最終你會獲得相似下面的圖形:
散點圖是一堆離散點的集合。用 Matplotlib 畫散點圖也一樣很是簡單。
In [27]: x = np.linspace(0, 2*np.pi, 50) In [28]: y = np.sin(x) In [29]: plt.scatter(x, y) Out[29]: <matplotlib.collections.PathCollection at 0x1dcddb706a0> In [30]: plt.show()
正如上面代碼所示,你只須要調用 scatter() 函數並傳入兩個分別表明 x 座標和 y 座標的數組。注意,咱們經過 plot 命令並將線的樣式設置爲 'bo' 也能夠實現一樣的效果。
最後你會獲得相似下面的無線圖形:
另外一種你可能用到的圖形是彩色映射散點圖。這裏咱們會根據數據的大小給每一個點賦予不一樣的顏色和大小,並在圖中添加一個顏色欄。
In [31]: x = np.random.rand(1000) In [32]: y = np.random.rand(1000) In [33]: size = np.random.rand(1000) * 50 In [34]: colour = np.random.rand(1000) In [35]: plt.scatter(x, y, size, colour) Out[35]: <matplotlib.collections.PathCollection at 0x1dcdde984e0> In [36]: plt.colorbar() Out[36]: <matplotlib.colorbar.Colorbar at 0x1dcddece0b8> In [37]: plt.show()
上面的代碼大量的用到了 np.random.rand(1000),緣由是咱們繪圖的數據都是隨機產生的。
同前面同樣咱們用到了 scatter() 函數,可是此次咱們傳入了另外的兩個參數,分別爲所繪點的大小和顏色。經過這種方式使得圖上點的大小和顏色根據數據的大小產生變化。
而後咱們用 colorbar() 函數添加了一個顏色欄。
最後你會獲得相似於下面的彩色散點圖:
直方圖是另外一種常見的圖形,也能夠經過幾行代碼建立出來。
In [38]: x = np.random.randn(1000) In [39]: plt.hist(x, 50) Out[39]: (array([ 2., 0., 0., 1., 2., 2., 1., 0., 1., 1., 9., 6., 11., 16., 20., 18., 23., 26., 34., 25., 42., 31., 52., 40., 38., 56., 35., 49., 49., 41., 44., 46., 46., 31., 30., 32., 26., 24., 24., 16., 8., 5., 12., 4., 4., 5., 2., 7., 2., 1.]), array([-3.32384545, -3.20164134, -3.07943724, -2.95723314, -2.83502904, -2.71282494, -2.59062084, -2.46841674, -2.34621264, -2.22400854, -2.10180443, -1.97960033, -1.85739623, -1.73519213, -1.61298803, -1.49078393, -1.36857983, -1.24637573, -1.12417163, -1.00196752, -0.87976342, -0.75755932, -0.63535522, -0.51315112, -0.39094702, -0.26874292, -0.14653882, -0.02433471, 0.09786939, 0.22007349, 0.34227759, 0.46448169, 0.58668579, 0.70888989, 0.83109399, 0.95329809, 1.0755022 , 1.1977063 , 1.3199104 , 1.4421145 , 1.5643186 , 1.6865227 , 1.8087268 , 1.9309309 , 2.05313501, 2.17533911, 2.29754321, 2.41974731, 2.54195141, 2.66415551, 2.78635961]), <a list of 50 Patch objects>) In [40]: plt.show()
直方圖是 Matplotlib 中最簡單的圖形之一。你只須要給 hist() 函數傳入一個包含數據的數組。第二個參數表明數據容器的個數。數據容器表明不一樣的值的間隔,並用來包含咱們的數據。數據容器越多,圖形上的數據條就越多。
最終你會獲得相似下面的直方圖:
當須要快速建立圖形時,你可能不須要爲圖形添加標籤。可是當構建須要展現的圖形時,你就須要添加標題,標籤和圖例。
In [41]: x = np.linspace(0, 2*np.pi, 50) In [42]: plt.plot(x, np.sin(x), 'r-x', label='Sin(x)') Out[42]: [<matplotlib.lines.Line2D at 0x1dcde55db00>] In [43]: plt.plot(x, np.cos(x), 'g-^', label='Cos(x)') Out[43]: [<matplotlib.lines.Line2D at 0x1dcde282ac8>] In [44]: plt.legend() # 展現圖例 Out[44]: <matplotlib.legend.Legend at 0x1dcde282dd8> In [45]: plt.xlabel('Rads') # 給x軸添加標籤 Out[45]: Text(0.5,0,'Rads') In [46]: plt.ylabel('Amplitude') # 給y軸添加標籤 Out[46]: Text(0,0.5,'Amplitude') In [47]: plt.title('Sin and Cos Waves') # 添加圖形標題 Out[47]: Text(0.5,1,'Sin and Cos Waves') In [48]: plt.show()
爲了給圖形添加圖例,咱們須要在 plot() 函數中添加命名參數 'label' 並賦予該參數相應的標籤。而後調用 legend() 函數就會在咱們的圖形中添加圖例。
接下來咱們只須要調用函數 title(),xlabel() 和 ylabel() 就能夠爲圖形添加標題和標籤。
你會獲得相似於下面這張擁有標題、標籤和圖例的圖形:
餅圖陰影、分裂等屬性設置:
# labels參數設置每一塊的標籤; # labeldistance參數設置標籤距離圓心的距離(比例值) # autopct參數設置比例值小數保留位(%.3f%%); # pctdistance參數設置比例值文字距離圓心的距離 # explode參數設置每一塊頂點距圓心的長度(比例值,列表); # colors參數設置每一塊的顏色(列表); # shadow參數爲布爾值,設置是否繪製陰影 # startangle參數設置餅圖起始角度
餅圖適合展現各部分佔整體的比例,條形圖適合比較各部分的大小
In [51]: x = [11, 22, 33, 44] In [52]: plt.pie(x, labels=['a', 'b', 'c', 'd']) Out[52]: ([<matplotlib.patches.Wedge at 0x1dcde8894a8>, <matplotlib.patches.Wedge at 0x1dcde8899b0>, <matplotlib.patches.Wedge at 0x1dcde889e80>, <matplotlib.patches.Wedge at 0x1dcde891390>], [Text(1.04616,0.339919,'a'), Text(0.339919,1.04616,'b'), Text(-1.04616,0.339919,'c'), Text(0.339919,-1.04616,'d')]) In [53]: plt.show()
最終你會獲得相似下面的餅圖: