Matplotlib數(shù)據(jù)可視化!

極市導(dǎo)讀
?數(shù)據(jù)可視化當(dāng)前前,在研究、教學(xué)和開發(fā)領(lǐng)域,乃是一個極為活躍而又關(guān)鍵的方面。本文簡單介紹了數(shù)據(jù)可視化的一些基礎(chǔ)知識,主要對Matplotlib 繪圖庫進行了介紹。?>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿
數(shù)據(jù)可視化,就是指將結(jié)構(gòu)或非結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換成適當(dāng)?shù)目梢暬瘓D表,然后將隱藏在數(shù)據(jù)中的信息直接展現(xiàn)于人們面前。相比傳統(tǒng)的用表格或文檔展現(xiàn)數(shù)據(jù)的方式,可視化能將數(shù)據(jù)以更加直觀的方式展現(xiàn)出來,使數(shù)據(jù)更加客觀、更具說服力。數(shù)據(jù)可視化已經(jīng)被用于工作科研的方方面面,如工作報表、科研論文等,成為了不可或缺的基礎(chǔ)技能?,F(xiàn)在,就讓我們一起來學(xué)習(xí)下數(shù)據(jù)可視化的基礎(chǔ)知識。
一、 常用可視化工具
Python有許多用于數(shù)據(jù)可視化的庫,例如常見的有seaborn、pyecharts(echarts的Python版本)、ggplot(移植于R語言的ggplot2,但是有些差別,Python有其他方法可以調(diào)用R語言的ggplot2)、bokeh、Plotly(同時支持Python和R語言)等等,這些大多是基于Matplotlib進行開發(fā)封裝的。Matplotlib是一個Python 2D繪圖庫(使用Matplotlib發(fā)布的mpl_toolkits庫可以畫3D圖形 ),能夠以多種硬拷貝格式和跨平臺的交互式環(huán)境生成出版物質(zhì)量的圖形,用來繪制各種靜態(tài),動態(tài),交互式的圖表。Matplotlib 是 Python 最著名的繪圖庫,它提供了一整套和 MATLAB 相似的命令 API,十分適合交互式地進行制圖。而且也可以方便地將它作為繪圖控件,使用在Python腳本,Python和IPython Shell、Jupyter notebook,Web應(yīng)用程序服務(wù)器和各種圖形用戶界面工具包等上面。
二、?Matplotlib 初識
1. 例子
Matplotlib的圖像是畫在figure(如windows,jupyter窗體)上的,每一個figure又包含了一個或多個axes(一個可以指定坐標系的子區(qū)域)。最簡單的創(chuàng)建figure以及axes的方式是通過pyplot.subplots命令,創(chuàng)建axes以后,可以使用Axes.plot繪制最簡易的折線圖。聲明:以下使用的是IPython Shell
%matplotlib??#?在IPython?Shell調(diào)用Matplotlib繪圖接口,需要加這行代碼
import?matplotlib.pyplot?as?plt
import?numpy?as?np
?
fig,?ax=?plt.subplots()??#?創(chuàng)建一個包含一個axes的figure
?#?繪圖
ax.plot([1,?2,?3,?4],?[1,?4,?3,?2])??
這里有一個小知識點,很小很小,但是對于剛剛接觸數(shù)據(jù)可視化的新手可能容易弄混。ax.plot([1, 2, 3, 4], [1, 4, 3, 2]) 這句代碼里面第一個參數(shù)是數(shù)據(jù)集里各個數(shù)據(jù)點的X值的集合,第二個參數(shù)數(shù)據(jù)集里各個數(shù)據(jù)點的Y值的集合。所以這里輸入的參數(shù)值并不是數(shù)學(xué)上常見的成對坐標點如(x1,y1)、(x2,y2)、...、(xn,yn)的格式,而是 (x1,x2,...,xn)和(y1,y2,...,yn) 。
2. 例子
和MATLAB命令類似,你還可以通過一種更簡單的方式繪制圖像,matplotlib.pyplot 方法能夠直接在當(dāng)前axes上繪制圖像,如果用戶未指定axes,matplotlib會幫你自動創(chuàng)建一個。所以上面的例子也可以簡化為以下這一行代碼。
plt.plot([1,?2,?3,?4],?[1,?4,?2,?3])??

這里有個trick(坑)需要注意一下。如上所示,在IPython或jupyter notebook的同一個代碼框中,如果不對其聲明畫在哪個圖上(可以使用 plot() 函數(shù)里面的 ax 參數(shù)進行指定),就會自動畫到最后一個創(chuàng)建的圖上(即最后一個Figure對象的最后一個Axes子圖里)。
plt.figure()??#?創(chuàng)建一個新的Figure對象
plt.plot([1,?2,?3,?4],?[1,?4,?2,?3])?

更多例子可以在Matplotlib官網(wǎng)查看:
https://matplotlib.org/gallery/index.html
三、 Matplotlib 全貌
現(xiàn)在我們來深入看一下figure的組成。通過一張figure解剖圖,我們可以看到一個完整的matplotlib圖像通常會包括以下四個層級,這些層級也被稱為容器(container),下一節(jié)會詳細介紹。在matplotlib的世界中,我們將通過各種命令方法來操縱圖像中的每一個部分,從而達到數(shù)據(jù)可視化的最終效果,一副完整的圖像實際上是各類子元素的集合。
Figure:頂層級,用來容納所有繪圖元素。 Axes:matplotlib宇宙的核心,容納了大量元素用來構(gòu)造一幅幅子圖,一個figure可以由一個或多個子圖組成。 Axis:axes的下屬層級,用于處理所有和坐標軸,網(wǎng)格有關(guān)的元素。 Tick:axis的下屬層級,用來處理所有和刻度有關(guān)的元素。

四、 Matplotlib 繪圖接口
matplotlib提供了兩種最常用的繪圖接口
顯式創(chuàng)建figure和axes,在上面調(diào)用繪圖方法,也被稱為OO模式(object-oriented style)。 依賴pyplot自動創(chuàng)建figure和axes,并繪圖。
使用第一種繪圖接口,是這樣的:
x?=?np.linspace(0,?2,?100)
fig,?ax?=?plt.subplots()??
ax.plot(x,?x,?label='linear')??
ax.plot(x,?x**2,?label='quadratic')??
ax.plot(x,?x**3,?label='cubic')??
ax.set_xlabel('x?label')?
ax.set_ylabel('y?label')?
ax.set_title("Simple?Plot")??
ax.legend()?

而如果采用第二種繪圖接口,繪制同樣的圖,代碼是這樣的:plt.figure() IPython 里面需要加這行,jupyter notebook則不用,原因見<2.2 例子2>。
x?=?np.linspace(0,?2,?100)
plt.figure()??#?IPython里面需要加這行,jupyter?notebook則不用
plt.plot(x,?x,?label='linear')?
plt.plot(x,?x**2,?label='quadratic')??
plt.plot(x,?x**3,?label='cubic')
plt.xlabel('x?label')
plt.ylabel('y?label')
plt.title("Simple?Plot")
plt.legend()

五、?討論
在工作或?qū)W習(xí)中通常何時會用到數(shù)據(jù)可視化,希望通過可視化達到什么目的?
個人經(jīng)驗:
① 在機器學(xué)習(xí)中,數(shù)據(jù)可視化經(jīng)常用于各種算法模型擬合效果的直觀展示。
例子1:線性回歸模型的擬合效果。
例子2:機器學(xué)習(xí)聚類算法的K-MEANS算法和DBSCAN算法對數(shù)據(jù)集劃分類別的效果對比。
下圖來源:K-MEANS可視化網(wǎng)站https://www.naftaliharris.com/blog/visualizing-k-means-clustering/
下圖來源:DBSCAN算法可視化網(wǎng)站https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/
② 在數(shù)據(jù)分析和數(shù)據(jù)挖掘中經(jīng)常用來檢查數(shù)據(jù)的分布,以及窺探數(shù)據(jù)集內(nèi)在的規(guī)律或事件發(fā)展的規(guī)律。以下是個人在數(shù)據(jù)分析和數(shù)據(jù)挖掘中使用到數(shù)據(jù)可視化的2個案例。
例1:使用黃氏曲線評估零售店促銷活動效果
例2:Kaggle項目:Predict Future Sales(商品未來銷量預(yù)測)
參考連接:(數(shù)據(jù)可視化開源教程)
https://github.com/datawhalechina/fantastic-matplotlib
推薦閱讀

