Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
Python 的scientific stack(一個介紹Python科學計算包的網站)已經完全成熟,並且有各種各樣用例的庫,包括機器學習(連結:machine learning),數據分析(連結:data analysis)。數據可視化是探索數據和清晰的解釋結果很重要的一部分,但是Python在過去卻相對於其他工具比如R落後一點。
幸運的是,近幾年出現很多新的數據可視化Python庫彌補了這個差距,matplotlib已經成為主要的數據可視化庫,但是還有很多其它的庫,比如vispy,bokeh,seaborn,pygal,folium,和networkx,他們都建立在matplotlib的基礎之上,或者擁有matplotlib所不具有的功能。
在這篇文章中,我們將運用真實世界的數據,然後使用這些庫進行數據的可視化。當我們這樣做的時候,我們將發現,每個庫最適合用在哪裡,以及如何利用Python數據可視化系統最有效。
探索數據集在我們進行數據可視化之前,讓我們快速查看一下我們將要用到的數據集。我們將用到的據來自openflights。我們將用到 route,airport,和airline這三個數據。route數據的每一行對應兩個機場之間的一條路線,以及相應的信息。arline數據的每一行對應一個航空公司。
首先,讀入數據:
數據沒有列標題,所以我們通過給columns這個屬性賦值來添加列標題。我們想把每一列作為字符串來讀入,這樣做是為了後面基於id匹配行時,比較數據框方便一點。我們通過讀取數據時設置dtype參數來達到目的。
我們可以快速看一下每個數據框:
airports.head()部分數據截圖:
airlines.head()
部分數據截圖:
routes.head()
部分數據截圖:
我們可以對每個數據集做各種各樣有趣的探索,但是通過把這些數據集合併起來,我們能有最大的收穫。當我們做數據分析的時候,Pandas可以幫助我們,因為它可以幫助我們很容易的過濾矩陣類型的數據,或著對矩陣數據使用某個函數。我們將深入一些有趣的度量,比如分析航空公司和航線。在我們做這些之前,我們需要做一點數據清理的工作:
routes = routes[routes["airline_id"] != "\N"]這行代碼保證我們airline_id的數據列中只包含數值型的數據。
繪製直方圖
現在我們了解了數據結構,我們可以繼續深入開始畫圖和探索數據。我們的第一個圖,將使用matplotlib庫。Matplotlib在Python中繪圖庫,是一個相對低水平的,所以為了畫出一個看起來很漂亮的圖,它通常要使用比其他的庫需要更多的命令。另一方面,你幾乎可以使用matplotlib繪製任何你想畫的圖。它非常靈活,但是靈活性帶來的問題就是冗餘問題。
我們首先繪製一個直方圖來展示每個航空公司的航線長度的分布。直方圖將所有的路線長度劃分成範圍(或著箱子),然後每個範圍內的數據點進行計數。這可以告訴我們,航空公司飛長線多一點還是飛短線多一點。
為了達到這個目的,我們首先要計算航線的長度。第一步是一個距離公式,我們使用半正矢距離,也就是計算兩個緯度,經度坐標對之間的距離。
然後我們可以定義一個功能,用來計算出發機場和目的機場之間的單程距離。想做這個,我們需要從routes這個數據框中提取出source_id和 dest_id兩列,然後使用airports數據框的id列來進行匹配,從而得到這些機場的經度和緯度。然後接下來就是計算問題了,下面是這個功能函數:
如果source_id列 或著 dest_id列有無效的值,這個函數將會出錯,所以我們要添加一個try/except模塊來捕捉這些錯誤。最後,我們使用pandas庫來在routes數據框上使用這個計算距離的函數。這將得到一個pandas序列包含所有的航線長度。航線長度都是千米級的。
route_lengths = routes.apply(calc_dist, axis=1)現在我們已經擁有了一系列的航線長度,我們可以創建一個直方圖,將我們得到的值轉換成範圍,然後計算每個範圍內有多少個數據點。
我們使用import matplotlib.pyplot as plt導入matplotlib的繪圖功能。最後我們在使用%matplotlib inline命令將matplotlib的圖表內嵌到ipython notebook中。最後我們可以使用plt.hist(route_lengths, bins=20)來繪製直方圖啦。我們可以看到,航空公司的短航線要多於長航線。使用Seaborn
我們可以使用python的高水平繪圖庫Seaborn,繪製出一樣的圖。Seaborn是基於matplotlib的,Seaborn用來繪製特定類型的圖,它通常需要做一些比較簡單統計工作。我們可以使用distplot函數來繪製一個頂端帶有核密度估計的直方圖。和密度估計是一條曲線,實質上是直方圖的平滑以後的版本,這樣能使我們更容易發現裡面的模式。
import seaborn
seaborn.distplot(route_lengths, bins=20)
如圖所示,Seaborn相比於matplotlib擁有更好的默認風格。對於matplotlib的所有繪圖,Seaborn裡面並沒有自己對應的版本,但是,使用Seaborn來快速繪製一個好看的,並且比matplotlib默認的圖表更加深入的圖表,是一個不錯的方式。如果你想要繼續深入,或著做更多的統計工作,Seaborn是一個很好的庫。條形圖
直方圖很好,但是或許我們想看一下航空公司的平均航線長度。這時我們就可以使用條形圖,每條航線會單獨對應條形圖裡面的一條,告訴我們每個航空公司的平均航線長度。這可以告訴我們哪些航班是飛本地區的,哪些是國際的。我們可以使用pandas,python的一個數據分析庫,計算出每個航空公司的平均航線長度。
首先,構造一個航空公司id和航線長度的數據框,我們把route_length_df基於airline_id來分組。實際上就是,每個航空公司構造一個數據框。然後使用pandas的aggregate函數對每個數據框裡面的length這一列求平均,然後再把計算結果重新組合成一個新的數據框。然後對數據框進行排序,把路線最多的航空公司放在最前面。然後我們可以把它用matplotlib畫出來
plt.bar(range(airline_route_lengths.shape[0]),
airline_route_lengths["length"])
Matplotlib的plt.bar方法可以畫出每個airline文件中(airline_route_lengths["length"])的航線—平均長度的關係圖。flies(airline_route_lengths["length"])上述圖的問題是我們不能很容易的看出哪家航空公司擁有什麼航線長度。所以我們需要看到坐標軸標籤。這有一點難,因為有太多的航空公司了。一種能使這個工作變得簡單的方法就是繪製交互圖,它允許我們放大或縮小來查看標籤。我們可以使用bokeh庫——它使繪製交互圖和意義伸縮的圖會變得簡單。
為了使用bokeh,我們首先需要預處理一下我們的數據:
上面的代碼可以獲取airline_route_lengths中每一行數據的名字,並添加在name這一列中,name這一列包含了每一個航空公司的名字,我們還添加了id這一列,用來做查找(apply函數不傳遞索引值)。最後我們重置索引來得到所有的唯一值,沒有這一步bokeh就不能正常的工作。
現在,我們繼續我們的圖表問題:
我們使用output_notebook創建背景虛化,在iPython的 notebook 裡畫出圖。然後我們使用數據框和指定的列繪製條形圖,最後,使用show函數顯示出畫好的圖。在notebook中產生的圖並不是圖像,它實質上是一個javascript插件,也正因為如此,我們在下面展示的是一個屏幕截圖,而不是真正的圖表。
有了這個圖,我們可以放大,看哪一趟航班的航線最長。上圖的標籤看起來都堆疊在了一起,但是當你放大以後就很容易看清楚了。水平條形圖
Pygal是python的一個數據分析庫,它能夠快速的繪製出很有吸引力的圖。我們可以用它來對路線按長度進行拆分。首先,我們把我們的路線分成短,中,長三類,並計算出在route_lengths中每一類所佔的百分比。
英文原文:https://www.dataquest.io/blog/python-data-visualization-libraries/
譯者:yaoyujia123