Python 的scientific stack(一個(gè)介紹Python科學(xué)計(jì)算包的網(wǎng)站)已經(jīng)完全成熟,并且有各種各樣用例的庫,包括機(jī)器學(xué)習(xí)(鏈接:machine learning),數(shù)據(jù)分析(鏈接:data analysis)。數(shù)據(jù)可視化是探索數(shù)據(jù)和清晰的解釋結(jié)果很重要的一部分,但是Python在過去卻相對(duì)于其他工具比如R落后一點(diǎn)。
幸運(yùn)的是,近幾年出現(xiàn)很多新的數(shù)據(jù)可視化Python庫彌補(bǔ)了這個(gè)差距,matplotlib已經(jīng)成為主要的數(shù)據(jù)可視化庫,但是還有很多其它的庫,比如vispy,bokeh,seaborn,pygal,folium,和networkx,他們都建立在matplotlib的基礎(chǔ)之上,或者擁有matplotlib所不具有的功能。
在這篇文章中,我們將運(yùn)用真實(shí)世界的數(shù)據(jù),然后使用這些庫進(jìn)行數(shù)據(jù)的可視化。當(dāng)我們這樣做的時(shí)候,我們將發(fā)現(xiàn),每個(gè)庫最適合用在哪里,以及如何利用Python數(shù)據(jù)可視化系統(tǒng)最有效。
在我們進(jìn)行數(shù)據(jù)可視化之前,讓我們快速查看一下我們將要用到的數(shù)據(jù)集。我們將用到的據(jù)來自openflights。我們將用到 route,airport,和airline這三個(gè)數(shù)據(jù)。route數(shù)據(jù)的每一行對(duì)應(yīng)兩個(gè)機(jī)場(chǎng)之間的一條路線,以及相應(yīng)的信息。arline數(shù)據(jù)的每一行對(duì)應(yīng)一個(gè)航空公司。
首先,讀入數(shù)據(jù):
我們可以快速看一下每個(gè)數(shù)據(jù)框:
airports.head()
部分?jǐn)?shù)據(jù)截圖:
airlines.head()
部分?jǐn)?shù)據(jù)截圖:
routes.head()
部分?jǐn)?shù)據(jù)截圖:
我們可以對(duì)每個(gè)數(shù)據(jù)集做各種各樣有趣的探索,但是通過把這些數(shù)據(jù)集合并起來,我們能有最大的收獲。當(dāng)我們做數(shù)據(jù)分析的時(shí)候,Pandas可以幫助我們,因?yàn)樗梢詭椭覀兒苋菀椎倪^濾矩陣類型的數(shù)據(jù),或著對(duì)矩陣數(shù)據(jù)使用某個(gè)函數(shù)。我們將深入一些有趣的度量,比如分析航空公司和航線。
在我們做這些之前,我們需要做一點(diǎn)數(shù)據(jù)清理的工作:
routes = routes[routes['airline_id'] != '\N']
這行代碼保證我們airline_id的數(shù)據(jù)列中只包含數(shù)值型的數(shù)據(jù)。
繪制直方圖
現(xiàn)在我們了解了數(shù)據(jù)結(jié)構(gòu),我們可以繼續(xù)深入開始畫圖和探索數(shù)據(jù)。我們的第一個(gè)圖,將使用matplotlib庫。Matplotlib在Python中繪圖庫,是一個(gè)相對(duì)低水平的,所以為了畫出一個(gè)看起來很漂亮的圖,它通常要使用比其他的庫需要更多的命令。另一方面,你幾乎可以使用matplotlib繪制任何你想畫的圖。它非常靈活,但是靈活性帶來的問題就是冗余問題。
我們首先繪制一個(gè)直方圖來展示每個(gè)航空公司的航線長度的分布。直方圖將所有的路線長度劃分成范圍(或著箱子),然后每個(gè)范圍內(nèi)的數(shù)據(jù)點(diǎn)進(jìn)行計(jì)數(shù)。這可以告訴我們,航空公司飛長線多一點(diǎn)還是飛短線多一點(diǎn)。
為了達(dá)到這個(gè)目的,我們首先要計(jì)算航線的長度。第一步是一個(gè)距離公式,我們使用半正矢距離,也就是計(jì)算兩個(gè)緯度,經(jīng)度坐標(biāo)對(duì)之間的距離。
然后我們可以定義一個(gè)功能,用來計(jì)算出發(fā)機(jī)場(chǎng)和目的機(jī)場(chǎng)之間的單程距離。想做這個(gè),我們需要從routes這個(gè)數(shù)據(jù)框中提取出source_id和 dest_id兩列,然后使用airports數(shù)據(jù)框的id列來進(jìn)行匹配,從而得到這些機(jī)場(chǎng)的經(jīng)度和緯度。然后接下來就是計(jì)算問題了,下面是這個(gè)功能函數(shù):
最后,我們使用pandas庫來在routes數(shù)據(jù)框上使用這個(gè)計(jì)算距離的函數(shù)。這將得到一個(gè)pandas序列包含所有的航線長度。航線長度都是千米級(jí)的。
route_lengths = routes.apply(calc_dist, axis=1)
現(xiàn)在我們已經(jīng)擁有了一系列的航線長度,我們可以創(chuàng)建一個(gè)直方圖,將我們得到的值轉(zhuǎn)換成范圍,然后計(jì)算每個(gè)范圍內(nèi)有多少個(gè)數(shù)據(jù)點(diǎn)。
使用Seaborn
我們可以使用python的高水平繪圖庫Seaborn,繪制出一樣的圖。Seaborn是基于matplotlib的,Seaborn用來繪制特定類型的圖,它通常需要做一些比較簡(jiǎn)單統(tǒng)計(jì)工作。我們可以使用distplot函數(shù)來繪制一個(gè)頂端帶有核密度估計(jì)的直方圖。和密度估計(jì)是一條曲線,實(shí)質(zhì)上是直方圖的平滑以后的版本,這樣能使我們更容易發(fā)現(xiàn)里面的模式。
import seaborn
seaborn.distplot(route_lengths, bins=20)
條形圖
直方圖很好,但是或許我們想看一下航空公司的平均航線長度。這時(shí)我們就可以使用條形圖,每條航線會(huì)單獨(dú)對(duì)應(yīng)條形圖里面的一條,告訴我們每個(gè)航空公司的平均航線長度。這可以告訴我們哪些航班是飛本地區(qū)的,哪些是國際的。我們可以使用pandas,python的一個(gè)數(shù)據(jù)分析庫,計(jì)算出每個(gè)航空公司的平均航線長度。
然后我們可以把它用matplotlib畫出來
plt.bar(range(airline_route_lengths.shape[0]),
airline_route_lengths['length'])
airline_route_lengths['length']
)上述圖的問題是我們不能很容易的看出哪家航空公司擁有什么航線長度。所以我們需要看到坐標(biāo)軸標(biāo)簽。這有一點(diǎn)難,因?yàn)橛刑嗟暮娇展玖?。一種能使這個(gè)工作變得簡(jiǎn)單的方法就是繪制交互圖,它允許我們放大或縮小來查看標(biāo)簽。我們可以使用bokeh庫——它使繪制交互圖和意義伸縮的圖會(huì)變得簡(jiǎn)單。
為了使用bokeh,我們首先需要預(yù)處理一下我們的數(shù)據(jù):
最后我們重置索引來得到所有的唯一值,沒有這一步bokeh就不能正常的工作。
現(xiàn)在,我們繼續(xù)我們的圖表問題:
在notebook中產(chǎn)生的圖并不是圖像,它實(shí)質(zhì)上是一個(gè)javascript插件,也正因?yàn)槿绱?,我們?cè)谙旅嬲故镜氖且粋€(gè)屏幕截圖,而不是真正的圖表。
水平條形圖
Pygal是python的一個(gè)數(shù)據(jù)分析庫,它能夠快速的繪制出很有吸引力的圖。我們可以用它來對(duì)路線按長度進(jìn)行拆分。首先,我們把我們的路線分成短,中,長三類,并計(jì)算出在route_lengths中每一類所占的百分比。
英文原文:https://www.dataquest.io/blog/python-data-visualization-libraries/
譯者:yaoyujia123
聯(lián)系客服