matplotlib | Python強大的作圖工具,讓你從此駕馭圖表

TechFlow2019發表於2020-09-11

今天是資料處理專題的第9篇文章,在之前的8篇文章當中我們已經介紹完了pandas這個庫的一些基本用法,我們先把一些冷門的高階用法放一放,先來給大家介紹一下另外一個很有用的資料分析庫——matplotlib

matplotlib簡介

如果你在大學裡參加過數學建模競賽或者是用過MATLAB的話,相比會對這一款軟體中的畫圖功能印象深刻。MATLAB可以做出各種函式以及數值分佈影像非常的好用和方便。如果你沒用過呢也沒關係,知道這麼回事就好了。MATLAB雖然好用,但畢竟是收費軟體,而且相比於MATLAB,很多人更喜歡Python的語法。

所以呢MATLAB就被惦記上了,後來有大神仿照MATLAB當中的畫圖工具,也在Python當中開發了一個類似的作圖工具。這也就是我們今天這篇文章要講的matplotlib,也是Python、資料分析以及機器學習領域當中使用最廣泛的作圖工具包,幾乎沒有之一。前段時間不是美國政府搞事情,導致MATLAB公司宣佈對中國的幾所高校禁止使用MATLAB嘛,有一些人就提出來說我們可以使用Python當中的一些開源工具代替,當然MATLAB當中還有很多其他厲害的功能,Python可能不一定能代替,但至少在作圖這個領域是沒問題的。

matplotlib 基本用法

matplotlib廣泛流行的一個非常主要的原因就是它方便、好用,我們來看幾個經典的例子就知道了,短短几行程式碼就可以作出質量非常高的圖。

我們使用的是matplotlib這個包下的pyplot這個庫,從名字上我們也看得出來它是Python庫。如果你安裝了Anaconda這樣完整的Python包管理工具的話,那麼這個包預設應該已經裝好了。如果沒有,可以使用pip安裝一下,命令也非常簡單。

pip install matplotlib

裝好了包之後,我們通常的使用慣例是將它重新命名成plt,所以如果你閱讀一些原始碼以及其他大神的程式碼,作圖的時候經常會出現plt.xxx,就是這麼來的。

import matplotlib.pyplot as plt

plot當中有幾種常用的作圖工具,第一種是作折線圖或者是曲線圖的,叫做plot。第二種是作柱狀圖的叫做hist,第三種是作散點圖的,叫做scatter,第四種是作餅狀圖的。除此之外還可以作一些三維的影像,但是一般日常當中使用得比較少,大部分是用來炫技的。

曲線圖

plot其實是用來作曲線圖的,採用的方法是描點呈現,它會將我們的資料點串聯起來,成為一條光滑的曲線。當然,作折線、直線也都是可以的,最後成圖的效果完全是由我們的資料決定的。

它的使用方法很簡單,在最基本的用法當中,我們只需要傳入兩個list,分別代表x軸和y軸的值即可。比如我們要作出一個logistic的函式影像。我們可以這樣:

x = np.linspace(-1010100)
y = 1 / (1 + np.exp(-x))

plt.plot(x, y)
plt.show()

在上面的程式碼當中我們首先使用numpy當中的linspace函式生成了一個-10到10之間的numpy陣列。這個陣列當中有100個點,在-10到10之間均勻分佈。我們對它計算對應的logistic函式的值,也就是。這個函式我想大家都應該很熟悉了,x是一個一百個點的list,對應的y也是一個一百個點的list。也就是說一個x對應一個y構成了一個點對,代表圖中的一個座標。

我們不需要做任何轉化,只需要把這兩個陣列傳入plt當中,它會自動替我們完成座標的對映。最後呈現的效果如下。

我們可以看到作圖的效果還是不錯的,除了把影像完成的繪製出來之外,還替我們在座標軸上畫上了點位,方便我們檢視資料。

直方圖

hist可以用來繪製直方圖,這也是我們非常常見的影像。在財經領域我們經常用直方圖反應一個資料的走勢,在資料分析和機器學習當中我們也經常用直方圖來反應某一個特徵或者是值的分佈。

在直方圖當中我們只需要傳入一個陣列,就是我們要求分佈的陣列,另外我們需要再輸入一個引數bins,表示我們希望將資料分桶的數量。然後它會繪製出每個桶中資料數量的直方圖,這樣我們就可以很直觀地看出分佈來了。

x = np.random.normal(size=200)
plt.hist(x,bins=30)
plt.show()

這裡我們呼叫numpy當中以正態分佈概率隨機的函式,得到的結果應該是正態分佈的。

我們檢視影像,這個結果和我們的預期基本吻合。

點狀圖

第三種影像叫做散點圖,它反應的是每個點的分佈情況。比如我們之前在介紹KNN和Kmeans模型的時候曾經都作過散點圖,一個點代表一個樣本,通過散點圖我們觀察的也是樣本和資料分佈的情況。但是和直方圖相比它更加得直觀,我們能直接看到分佈,而不是一個分佈的統計結果。

但是它也有缺點,缺點就是我們只能觀察二維平面當中的點的分佈,畢竟超過3維的維度就沒辦法繪製了。而且3維的資料分佈也不是很好觀察。

同樣散點圖的繪製也很簡單,我們只需要呼叫scatter函式傳入x和y的陣列即可。

x = np.random.rand(100)
y = np.random.rand(100)

plt.scatter(x, y)

這裡我們的x和y都是隨機分佈,所以得到的結果是散亂沒有規律的點。

餅狀圖

最後我們來看下餅狀圖,餅狀圖也很常用,雖然也是反映的資料分佈,但是它更多是體現某一個值佔的比例。通過餅狀圖,我們可以很直觀地瞭解到這點。

我們可以傳入一個list進入pie函式,plot會根據list當中值在總體的佔比繪製餅狀圖。我們來看個很簡單的例子:

a = np.array([0.50.30.20.10.8])

plt.pie(a)

得到的結果如下:

和之前的結果相比餅狀圖稍稍不清晰一些,因為它雖然用不同顏色區分了不同的區域的,但是我們很難直觀地看出來每一個區域分別代表什麼。這個問題是可以解決的,我們可以通過傳入一些引數和設定來讓它展示更多的資訊,讓資料變得更加生動以及清晰。

今天的文章到這裡就結束了,如果喜歡本文的話,請來一波素質三連,給我一點支援吧(關注、轉發、點贊)。

原文連結,求個關注

- END -

{{uploading-image-462153.png(uploading...)}}

相關文章