作者:麥可·貝耶勒(Michael Beyeler)
如需轉載請聯繫大數據(ID:hzdashuju)
01 引入 Matplotlib
如果已安裝Anaconda Python版本,就已經安裝好了可以使用的 Matplotlib。否則,可能要訪問官網並從中獲取安裝說明:
http://matplotlib.org
正如使用np作為 NumPy 的縮寫,我們將使用一些標準的縮寫來表示 Matplotlib 的引入:
In [1]: import matplotlib as mpl
In [2]: import matplotlib.pyplot as plt
在本書中,plt接口會被頻繁使用。
02 生成一個簡單的繪圖
讓我們創建第一個繪圖。
假設想要畫出正弦函數sin(x)的線性圖。得到函數在x坐標軸上0≤x<10內所有點的值。我們將使用 NumPy 中的 linspace 函數來在x坐標軸上創建一個從0到10的線性空間,以及100個採樣點:
In [3]: import numpy as np
In [4]: x = np.linspace(0, 10, 100)
可以使用 NumPy 中的sin函數得到所有x點的值,並通過調用plt中的plot函數把結果畫出來:
In [5]: plt.plot(x, np.sin(x))
你親自嘗試了嗎?發生了什麼嗎?有沒有什麼東西出現?
實際情況是,取決於你在哪裡運行腳本,可能無法看到任何東西。有下面幾種可能性:
1. 從.py腳本中繪圖
如果從一個腳本中運行 Matplotlib,需要加上下面的這行調用:
在腳本末尾調用這個函數,你的繪圖就會出現!
2. 從 IPython shell 中繪圖
這實際上是交互式地執行Matplotlib最方便的方式。為了讓繪圖出現,需要在啟動 IPython 後使用所謂的%matplotlib魔法命令。
In [1]: %matplotlib
Using matplotlib backend: TkAgg
In [2]: import matplotlib.pyplot as plt
接下來,無須每次調用plt.show()函數,所有的繪圖將會自動出現。
3. 從 Jupyter Notebook 中繪圖
如果你是從基於瀏覽器的 Jupyter Notebook 中看這段代碼,需要使用同樣的%matplotlib魔法命令。然而,也可以直接在notebook中嵌入圖形,這會有兩種輸出選項:
在本書中,將會使用inline選項:
In [6]: %matplotlib inline
現在再次嘗試一下:
In [7]: plt.plot(x, np.sin(x))
Out[7]: [<matplotlib.lines.Line2D at 0x7f3aac426eb8>]
上面的命令會得到下面的繪圖輸出結果:
▲使用 Matplotlib 繪製正弦函數圖像
如果想要把繪圖保存下來留作以後使用,可以直接在 IPython 或者 Jupyter Notebook 使用下面的命令保存:
In [8]: plt.savefig('figures/02.03-sine.png')
僅需要確保你使用了支持的文件後綴,比如.jpg、.png、.tif、.svg、.eps或者.pdf。
Tips:可以在引入Matplotlib後通過運行plt.style.use(style_name)來修改繪圖的風格。所有可用的風格在plt.style.available中列出。比如,嘗試使用plt.style.use('fivethirtyeight')、plt.style.use('ggplot')或者plt.style.use('seaborn-dark')。為了更好玩,可以運行plt.xkcd(),然後嘗試繪製一些別的圖形。
03 可視化外部數據集的數據
作為本章最後一個測試,讓我們對外部數據集進行可視化,比如scikit-learn中的數字數據集。
為此,需要三個可視化工具:
scikit-learn用於獲取實際數據
NumPy 用於數據再加工
Matplotlib
那麼開始引入這些包吧:
In [1]: import numpy as np
... from sklearn import datasets
... import matplotlib.pyplot as plt
... % matplotlib inline
第一步是載入實際數據:
In [2]: digits = datasets.load_digits()
如果沒記錯的話,digits應該有兩個不同的數據域:data域包含了真正的圖像數據,target域包含了圖像的標籤。相對於相信我們的記憶,我們還是應該對digits稍加探索。輸入它的名字,添加一個點號,然後按Tab鍵:digits.<TAB>,這個操作將向我們展示digits也包含了一些其他的域,比如一個名為images的域。images和data這兩個域,似乎簡單從形狀上就可以區分。
In [3]: print(digits.data.shape)
... print(digits.images.shape)
Out[3]: (1797, 64)
... (1797, 8, 8)
兩種情況中,第一維對應的都是數據集中的圖像數量。然而,data中所有像素都在一個大的向量中排列,而images保留了各個圖像8×8的空間排列。
因此,如果想要繪製出一副單獨的圖像,使用images將更加合適。首先,使用NumPy的數組切片從數據集中獲取一幅圖像:
In [4]: img = digits.images[0, :, :]
這裡是從1797個元素的數組中獲取了它的第一行數據,這行數據對應的是8×8=64個像素。下面就可以使用plt中的imshow函數來繪製這幅圖像:
In [5]: plt.imshow(img, cmap='gray')
Out[5]: <matplotlib.image.AxesImage at 0x7efcd27f30f0>
上面的命令得到下面的輸出:
▲數字數據集中的一個圖像樣例
此外,這裡也使用cmap參數指定了一個顏色映射。默認情況下,Matplotlib 使用MATLAB默認的顏色映射jet。然而,在灰度圖像的情況下,gray顏色映射更有效。
最後,可以使用plt的subplot函數繪製全部數字的樣例。subplot函數與MATLAB中的函數一樣,需要指定行數、列數以及當前的子繪圖索引(從1開始計算)。我們將使用for 循環在數據集中迭代出前十張圖像,每張圖像都分配到一個單獨的子繪圖中。
In [6]: for image_index in range(10):
...
... subplot_index = image_index + 1
... plt.subplot(2, 5, subplot_index)
... plt.imshow(digits.images[image_index, :, :], cmap='gray')
這會得到下面的輸出結果:
▲數字數據集中的十幅樣例圖像
Tips:另一個擁有各種數據集資源的是我的母校——加利福尼亞大學歐文分校的機器學習倉庫:
http://archive.ics.uci.edu/ml