Python的數據可視化:對比7種工具包

2021-02-20 Python程式設計師


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

相關焦點

  • Python數據可視化:2018年電影分析
    數據分析以及可視化。本次只對有電影評分的數據進行獲取。/ 02 / 反爬破解通過開發人員工具發現,貓眼針對評分,評分人數,累計票房的數據,施加了文字反爬。/ 05 / 數據可視化可視化源碼就不放了,公眾號回復
  • Python學習:mac電腦安裝python教程
    與python2.7 共存2 下載安裝包進入官方安裝包下載頁面,https://www.python.org/downloads/mac-osx/找到合適的安裝包,基本上mac電腦都是64位的系統,因此選擇64位的安裝包進行下載
  • 深度對比:Python和R之爭
    應用R的場景統計分析: 儘管 Python 裡 Scipy、Pandas、statsmodels 提供了一系列統計工具 ,R 本身是專門為統計分析應用建立的,所以擁有更多此類工具。互動式圖表/面板: 近來 bokeh、plotly、 intuitics 將 Python 的圖形功能擴展到了網頁瀏覽器,甚至我們可以用tornado+d3來進一步定製可視化頁面,但 R 的 shiny 和 shiny dashboard 速度更快,所需代碼更少。數據流編程對比接著,我們將通過下面幾個方面,對Python 和 R 的數據流編程做出一個詳細的對比。
  • 新年微課:實戰學習網絡輿情可視化工具
    而隨著大數據時代的到來,網絡輿論在數據體量、複雜性和產生速度等方面發生巨大變化。以往的網絡輿情的內容樣本分析已無法準確的描繪熱點事件中網絡輿論的發展之勢了。而可視化工具的出現則很好的彌補了這一缺陷。它不僅可以抓取輿論數據,並繪製出網絡輿論的傳播軌跡圖,了解網絡事件的傳播發展過程。
  • Python炫技操作:花式導包的八種方法
    ; import imp>>> file, pathname, desc = imp.find_module('os')>>> myos = imp.load_module('sep', file, pathname, desc)>>> myos<module 'sep' from '/usr/lib64/python2.7
  • Python爬蟲實戰:爬取天氣數據的實例詳解
    在本篇文章裡小編給大家整理的是一篇關於python爬取天氣數據的實例詳解內容,有興趣的朋友們學習下。
  • Pajek:關係網絡分析和可視化工具
    另一種是2-mode(二模網絡),主要用於具有從屬關係的網絡,比如人員和部門可以作為網絡的節點,這樣該網絡就有兩種節點。如此,看來,在用戶社交關係分析和可視化中,選擇1-mode就可以。網絡數據文件       在我的分析任務中,用戶數據存儲於關係型資料庫,因此可以比較方便生成Pajek所需要的網絡數據文件。
  • 大數據2015:Hadoop和大數據-60款頂級大數據開源工具
    相關連結:https://cwiki.apache.org/confluence/display/FLUME/Home7. HBaseHBase是為有數十億行和數百萬列的超大表設計的,這是一種分布式資料庫,可以對大數據進行隨機性的實時讀取/寫入訪問。
  • python黑知識:python本體
    講述python的實現本體,版本,構建時間,構建工具和構建參數python的實現有很多種,如果想研究一下它語言本身一些機制的實現,可能需要看原始碼,那麼,就需要找到相應的實現,分支和版本。目前使用的python實現,根據python實現存在有這幾種CPython, Stackless Python, MicroPython, CLPython, Cython, IronPython, Jython, Pyjs, PyPy, Numba, Shed Skin Nuitka ,可以說是讓人眼花繚亂。
  • 詞彙星空:如何構建一個炫酷的 Word2Vec 可視化
    用於該可視化的數據集來自GloVe,包含60億詞條,40萬單詞,每個單詞由一個300維向量表示。2.2數據與數據預處理我使用了GloVe項目的預訓練過的word2vec模型。唉,這使得可視化變得無趣。當我從一個集群到另一個集群時,卻發現只是從一個全是2017 - 2300的數字,而另一個是0.501 .. 0.403在Common Crawl 的word2vec編碼中,我刪除了所有包含非單詞字符或數字的單詞。在我看來,這使得可視化更加有趣,但很多集群仍然不容易理解。
  • Python數據分析:股票數據分析案例
    步驟:準備數據可視化數據、審查數據處理數據根據ACF、PACF定階擬合ARIMA模型預測準備數據    # 指定股票分析開始日期    start_date = datetime.datetime(2009, 1, 1)    # 指定股票分析截止日期    end_date = datetime.datetime(2019, 4, 1)    # 股票代碼    stock_code = '600519.SS'    # 滬市貴州茅臺
  • Python詞雲:Windows安裝Wordcloud報錯解決辦法
    不過沒關係,今天我手把手教你怎麼安裝Wordcloud包。首先,先看清楚你的python版本,以及搞清楚你的python是基於32位系統還是64位系統。然後,去下面這個網址下載對應的wordcloud包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud          找到對應版本的wordcloud包,比如我的python的版本是3.8.2,基於32位系統,那就要找對應下面紅框的這個包下載下來。
  • python基礎學習教程:Python基礎語法
    linux上你只需要在命令行中輸入 Python 命令即可啟動交互式編程,提示窗口如下:$ pythonPython 2.7.6 (default, Sep 9 2014, 15:04:36) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwinType
  • 隱寫工具:cloacked-pixel
    在看山科的師傅們的 wp 的時候知道的,今年山東省省賽用到了這個工具
  • Python數據可視化:平凡的世界
    max_font_size=250,    min_font_size=15,    color_func=random_color_func,    prefer_horizontal=1,    random_state=50)wc.generate_from_frequencies({'田海民': 76, '馬來花': 15, '雷區長': 7,
  • Python 炫技操作:五種 Python 轉義表示法
    舉個例子>>> msg = "hello\013world\013hello\013python">>> print(msg)hello     world          hello               python>>> 是不是有點神奇
  • 全球抗「疫」:用Python帶你了解世界疫情
    通過本文,你會學到如何用Python做數據分析,數據可視化,畫世界疫情地圖,了解世界疫情。本次用到的數據我在前面文章分享過,具體見全球抗「疫」:各國疫情數據早知道。下面我會詳細介紹如何使用這些數據,建議本文代碼在Jupyter notebook上運行,話不多說,Let『s go!
  • 新一代Android渠道打包工具:1000個渠道包只需要5秒
    新一代Android渠道打包工具:1000個渠道包只需要5秒 源碼:https://github.com/mcxiaoke/packer-ng-plugin
  • pandas 花式保存 Excel 數據的 N 種姿勢!
    Pandas的Styler對表格著色輸出如果我們想對指定的列的數據設置文字顏色或背景色,可以直接pandas.io.formats.style工具,該工具可以直接對指定列用指定的規則著色:相關資料1. python讀寫Excel文件的那些庫來源:http://www.python-excel.org/讀取和寫入EXCEL2010文件的包(即.xlsx)文檔:https://openpyxl.readthedocs.org
  • Python 情人節告白特技:隱藏在聊天記錄裡的珍貴禮物
    如果說用網上流傳的方法提取文本數據,iOS則需要下載itunes備份整機,安卓則需要本機的root權限,無論是哪種都非常麻煩,在這裡給大家介紹一種不需要整機備份和本機root權限,只導出和對象的聊天數據的方法。