歡迎光臨
每天分享高質量文章

Python實操:手把手教你用Matplotlib把資料畫出來

導讀:獲取資料之後,而不知道如何查看資料,用途還是有限的。幸好,我們有Matplotlib!

Matplotlib 是基於 NumPy 陣列構建的多平臺資料可視化庫。它是John Hunter 在2002年構想的,原本的設計是給 IPython 打補丁,讓命令列中也可以有交互式的 MATLAB 風格的畫圖工具。

在近些年,已經出現了更新更好的工具最終替代了 Matplotlib(比如 R 語言中的ggplot和ggvis), 但 Matplotlib 依舊是一個經過良好測試的、跨平臺的圖形引擎。

 

 

作者:邁克爾·貝耶勒(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(010100)

 

可以使用 NumPy 中的sin函式得到所有x點的值,並通過呼叫plt中的plot函式把結果畫出來:

 

In [5]: plt.plot(x, np.sin(x))

 

你親自嘗試了嗎?發生了什麼嗎?有沒有什麼東西出現?

 

實際情況是,取決於你在哪裡運行腳本,可能無法看到任何東西。有下麵幾種可能性:

 

1. 從.py腳本中繪圖

 

如果從一個腳本中運行 Matplotlib,需要加上下麵的這行呼叫:

 

plt.show()

 

在腳本末尾呼叫這個函式,你的繪圖就會出現!

 

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中嵌入圖形,這會有兩種輸出選項:

 

  • %matplotlib notebook 將會把交互式的繪圖嵌入到notebook中

  • %matplotlib inline 將會把繪圖的靜態圖像嵌入到notebook中

 

在本書中,將會使用inline選項:

 

In [6]: %matplotlib inline

 

現在再次嘗試一下:

 

In [7]: plt.plot(x, np.sin(x))
Out[7]: [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.,這個操作將向我們展示digits也包含了一些其他的域,比如一個名為images的域。images和data這兩個域,似乎簡單從形狀上就可以區分。

 

In [3]: print(digits.data.shape)
...     print(digits.images.shape)
Out[3]: (179764)
...     (179788)

 

兩種情況中,第一維對應的都是資料集中的圖像數量。然而,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]: 0x7efcd27f30f0>

 

上面的命令得到下麵的輸出:

 

▲數字資料集中的一個圖像樣例

 

此外,這裡也使用cmap引數指定了一個顏色映射。預設情況下,Matplotlib 使用MATLAB預設的顏色映射jet。然而,在灰度圖像的情況下,gray顏色映射更有效。

 

最後,可以使用plt的subplot函式繪製全部數字的樣例。subplot函式與MATLAB中的函式一樣,需要指定行數、列數以及當前的子繪圖索引(從1開始計算)。我們將使用for 迴圈在資料集中迭代出前十張圖像,每張圖像都分配到一個單獨的子繪圖中。

 

In [6]: for image_index in range(10):
...         # 圖像按0開始索引,子繪圖按1開始索引
...         subplot_index = image_index + 1
...         plt.subplot(25, subplot_index)
...         plt.imshow(digits.images[image_index, :, :], cmap='gray')

 

這會得到下麵的輸出結果:

 

▲數字資料集中的十幅樣例圖像

 

Tips:另一個擁有各種資料集資源的是我的母校——加利福尼亞大學歐文分校的機器學習倉庫:

http://archive.ics.uci.edu/ml

 

關於作者:Michael Beyeler,華盛頓大學神經工程和資料科學專業的博士後,主攻仿生視覺計算模型,用以為盲人植入人工視網膜(仿生眼睛),改善盲人的視覺體驗。 他的工作屬於神經科學、計算機工程、計算機視覺和機器學習的交叉領域。同時他也是多個開源專案的積極貢獻者。 

本文摘編自機器學習:使用OpenCV和Python進行智慧圖像處理,經出版方授權發佈。

延伸閱讀《機器學習

點擊上圖瞭解及購買

轉載請聯繫微信:DoctorData

推薦語:OpenCV是一個綜合了經典和先進計算機視覺、機器學習演算法的開源庫。通過與Python Anaconda版本結合,你就可以獲取你所需要的所有開源計算庫。 本書首先介紹分類和回歸等統計學習的基本概念,然後詳細講解決策樹、支持向量機和貝葉斯網絡等演算法,以及如何把它們與其他OpenCV函式結合。

赞(0)

分享創造快樂