Python 可视化库
https://www.infoq.cn/article/pSV6tZ1SbUC8qJpo_v8H
在奧斯汀舉行的SciPy 2018年特別會議上,大量開源 Python 可視化工具的代表分享了他們對 Python 數據可視化未來的展望。我們看到了Matplotlib、Plotly、VisPy等許多庫的更新。我作為PyViz、GeoViews、Datashader、Panel、hvPlot和Bokeh的代表參加了 SciPy 2018 大會,我在 Anaconda 的同事 Jean-Luc Stevens 則代表HoloViews參加。本文介紹了當前可用的軟件包以及它們之間的關系。
當前生態
作為背景介紹,我先展示 Jake VanderPlas 的概覽圖,其中有許多不同而又相互關聯的 Python 可視化庫:
從中可以看到,這些庫主要可以分成幾組,每個組都有不同的起源、歷史和關注點。顯然,可視化物理位置數據的“SciVis”庫(在圖左下方)可以單獨分成一組。這些工具(VisPy、glumpy、GR、Mayavi、ParaView、VTK和yt)主要是基于 1992 年 OpenGL 圖形標準構建的,為規則或不規則網格數據提供了三維或四維(3D 加上時間維度)物理過程圖形密集可視化。這些庫對富 Web 應用程序的支持早于 HTML5,通常側重于工程或科學環境中的高性能桌面 GUI 應用程序。
其他庫幾乎都屬于“InfoVis”組,側重于空間的信息可視化,而不一定是三維的物理世界。InfoVis 庫使用打印頁面或計算機屏幕的兩個維度來解釋抽象空間,通常使用軸和標簽。InfoVis 庫可以進一步細分為許多子組。
Matplotlib
2003 年發布的最古老也最受流行的 InfoVis 庫之一,具有非常廣泛的 2D 繪圖類型和輸出格式。Matplotlib對富 Web 應用程序的支持也早于 HTML5,而其側重點放在了靜態圖像和使用桌面 GUI 工具包(如 Qt 和 GTK)的交互式圖形上。Matplotlib 提供了一些 3D 支持,但比 SciVis 庫提供的支持要有限得多。
基于 Matplotlib 的庫
多年來,許多工具都是基于 Matplotlib 的 2D 繪圖功能構建的,要么將它作為某類數據或某一領域(pandas、NetworkX、Cartopy、yt等)的渲染引擎,要么提供一個更高級的 API 來簡化圖形繪制(ggplot、plotnine、HoloViews、GeoViews等),要么添加了額外的圖形類型(seaborn等)。
JavaScript
在 HTML5 為瀏覽器帶來豐富的交互性之后,許多庫就開始為網頁和 Jupyter Notebook 提供交互式 2D 繪圖,要么使用定制的 JS(Bokeh、Toyplot) ,要么像 D3 一樣以封裝現有的 JS 庫為主(Plotly、bqplot)。通過封裝現有的 JS 庫,很容易在巨大的 JS 市場引入新的圖形,而使用自定義 JS 則允許定義較底層的 JS 原語,這些原語可以在 Python 中組合成全新的圖形類型(如 Bokeh)。
JSON
隨著 D3 這樣的 JavaScript 庫日趨成熟,它們的功能已經被納入聲明性 JSON 規范(Vega、Vega-Lite),使得適用任何語言生成 JavaScript 圖形變得更簡單,現在也包括了 Python(通過Altair,之前是通過vincent)。具有可移植 JSON 形式的完整繪圖規范允許跨多種工具進行集成。
WebGL
就像 HTML5 對 JavaScript 2D 繪圖所做的那樣,WebGL 標準為瀏覽器 3D 交互和 Jupyter 帶來了可能性,這導致了基于 three.js(pythreejs、ipyvolume) 、vtk.js(itk-jupyter-widgets) 或 regl (Plotly)的瀏覽器 3D 繪圖。這些新的基于 Web 的 3D 方法沒有一種能夠達到桌面庫 SciVis 3D 的廣度和深度,但是,它們確實可以與 Jupyter Notebook 完全集成,并且可以通過 Web 進行共享和遠程使用。因此,盡管 WebGL 工具與 SciVis 工具有一些共同的應用,但它們與其他 InfoVis 工具的關系更為緊密。
其他
還有其他很多庫,盡管沒有出現在 Jake 的圖中,但它們確實提供了其他補充功能(例如graphviz用于可視化網絡)。
不同可視化工具的差異化特質
以上基于歷史和技術的分類有助于解釋我們當前為什么有大量 Python 可視化程序包,同時,它也有助于解釋為什么不同包之間在用戶功能方面存在著如此大的差異。具體來說,它們的主要差別在于支持的繪圖類型、數據規模、用戶界面和 API 類型,因此在選擇庫時不能只是出于個人喜好或便利性,而是需要考慮到以下一些因素。
繪圖類型
最基本的繪圖類型許多庫都有,但其他的繪圖類型只有某些庫會提供。考慮到庫的數量、繪圖類型及它們在隨時間變化,很難精確地描述每個庫都支持什么。但是,如果你看一下每個庫的示例,通常就可以弄清楚它們各自的側重點是什么。下面是一個粗略的指南:
- 統計繪圖(散點圖、線、區域、條形圖、直方圖):幾乎所有的 InfoVis 庫都可以很好地覆蓋這些圖形,但 Seaborn、bqplot、Altair、ggplot2、plotnine 會比較側重這些;
- 圖像、規則網格、矩形網格:Bokeh、Datashader、HoloViews、Matplotlib、Plotly 及大多數 SciVis 庫都提供了很好的支持;
- 不規格 2D 網格(三角網格):SciVis 庫以及 Matplotlib、Bokeh、Datashader、HoloViews 提供了很好的支持;
- 地理數據:Matplotlib(和 Cartopy 一起)、GeoViews、ipyleaflet、Plotly;
- 網絡 / 圖:NetworkX、Plotly、Bokeh、HoloViews、Datashader;
- 3D(網格、散點等):SciVis 庫完全支持,Plotly、Matplotlib、HoloViews 和 ipyvolume 部分支持。
數據規模
每個庫的架構和底層技術決定了它們所支持的數據規模,這樣就可以知道該庫是否適用于大圖片、電影、多維數組、長時間序列、網格或其他大型數據集:
- SciVis:通常可以處理非常大的網格數據集,GB 級別或更大,它使用編譯過的“數據庫(data libraries)”和原生 GUI 應用程序;
- 基于 Matplotlib:通常可以處理幾十萬個點,并提供合理的性能,在某些特殊情況下可以處理更多的點;
- JSON:如果沒有特殊處理,基于 JSON 文本的數據編碼會將基于 JSON 的規范限制在幾千個點到幾十萬個點之間,這取決于文件大小和所需的文本處理;
- JavaScript:ipywidgets、Bokeh 和 Plotly 都使用 JSON,但增加了額外的二進制數據傳輸機制,以便能夠處理數十萬到數百萬個數據點;
- WebGL:為了獲得良好的性能,使用 HTML Canvas 的 JavaScript 庫限制在最多幾十萬個點,但是 WebGL(通過 ipyvolume、Plotly 或 Bokeh)最多支持數百萬個點;
- 服務器端渲染:來自 Datashader 或 Vaex 的外部 InfoVis 服務器端渲染支持數十億、數萬億或更多數據點進入 Web 瀏覽器,通過將任意大小的分布式數據集或非核心數據集轉換為固定大小的圖像嵌入到客戶端瀏覽器中。
由于這些類型的庫所支持的數據規模(在某種程度上可以說是數據類型)范圍很大,因此,需要使用大型數據集的用戶首先需要選擇合適的庫。
用戶界面和發布
各種類型的庫在圖形的使用方式方面存在巨大差異。
- 靜態圖像:大多數庫現在支持通過“headless”的方式來創建靜態圖像,至少對于 PNG 和平滑矢量格式(如 SVG 或 PDF)來說是這樣的。
- 原生 GUI 應用程序:SciVis 庫加上 Matplotlib 和 Vaex 可以創建特定于操作系統的 GUI 窗口,這些窗口提供了很高的性能,支持大型數據集,并與其他桌面應用程序集成。但是,它們與特定的操作系統綁定在一起,通常需要在本地運行,而不是在 Web 上。在某些情況下,基于 JavaScript 的工具也可以通過嵌入 Web 瀏覽器嵌入到本地應用程序中。
- 導出到 HTML:大多數 JavaScript 和 JSON 庫都可以在無服務器模式下運行,生成交互式圖形(縮放、平移等),可以通過電子郵件或在 Web 服務器上發布,而不需要依賴 Python。
- Jupyter Notebook:大多數 InfoVis 庫現在都支持 Jupyter Notebook 交互式應用,借助 Python 提供的基于 JavaScript 的繪圖。基于 ipywidgets 的項目提供了與 Jupyter 更緊密的集成,而其他一些方法只提供了有限的 Jupyter 交互性。
- 基于 Web 的儀表盤和應用程序:借助Dash,Plotly 圖形可以用于單獨部署的應用程序,Bokeh、HoloViews 和 GeoViews 可以使用Bokeh 服務器部署。大多數其他 InfoVis 庫可以使用新的Panel庫部署成儀表盤,比如 Matplotlib、Altair、Plotly、Datashader、hvPlot、Seaborn、plotnine 和 yt。然而,盡管它們提供了基于 Web 的交互性,但基于 ipywidgets 的庫(ipyleaflet、pythreejs、ipyvolume、bqplot)很難部署成面向公眾的應用程序,因為 Jupyter 協議允許執行任意代碼(請參考Jupyter 儀表盤和flask-ipywidgets,它們或許可以作為潛在的解決方案)。
因此,用戶需要考慮給定的庫是否涵蓋了他們對可視化的預期使用范圍。
API 類型
各種 InfoVis 庫提供了大量的編程接口,適用于各種差別很大的用戶,并提供了不同創建可視化的方式。在執行普通任務所需的代碼量、為用戶處理不常見任務提供多大的控制自由度以及將原語組合成新類型圖形方面,這些 API 存在巨大的差別。
- 面向對象的 Matplotlib API:Matplotlib 的主要 API,允許完全控制和組合,但對于一些常見的任務,如創建子圖,則非常復雜和繁瑣。
- 命令式 Pyplot API:Matplotlib 的基本接口,允許使用 Matplotlib 風格的命令式命令,對于比較簡單的情況,這些命令很簡潔,但不可組合。因此,它們在很大程度上僅限于一組特定的支持選項。
- 命令式 Pandas .plot() API:以 dataframe 為中心,用戶將主要通過 Pandas 來準備數據,然后選擇一個子集進行繪圖。它們現在支持各種圖形庫及其他數據結構。不是直接組合,但可以從底層繪圖庫(如 hvPlot)返回可組合的對象。
- 聲明式圖形 API:受“圖形語法(?Grammar of Graphics)”啟發的庫(如 ggplot、plotnine、Altair)和 Bokeh 提供了一種自然的方式來組合圖形原語(如坐標軸和符號),用來創建完整的圖形。
- 聲明式數據 API:構建在其他庫的原生 API 的基礎上,HoloViews 和 GeoViews 提供了一個更高級的聲明式復合 API,主要關注注解、描述和使用可視化數據,而不是繪圖元素。
這些 API 都適用于具有不同背景和目標的用戶,這使得處理一些任務變得更簡單,而另一些任務則變得更加困難。除了 Matplotlib 之外,大多數庫都支持一種或至多兩種備選 API。因此,選擇一個符合每個用戶技術背景和首選工作流的庫顯得非常重要。
最新趨勢
如你所見,Python 有大量的可視化功能庫,大量可用的庫反映出了方法和側重點的多樣性。方法之間的差異仍然很重要,并且具有深遠的影響,這意味著用戶在特定的方法上大幅投入之前需要考慮這些差異。但是,正如我們在 SciPy 2018 上看到的那樣,趨同趨勢降低了用戶選擇的關鍵性。
查看英文原文:https://www.anaconda.com/blog/developer-blog/python-data-visualization-2018-why-so-many-libraries
轉載于:https://www.cnblogs.com/davidwang456/articles/10094925.html
總結
以上是生活随笔為你收集整理的Python 可视化库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并发工具类(三)控制并发线程数的Sema
- 下一篇: elasticSearch6源码分析(3