Jupyter 常見視覺化框架選擇

三次方根發表於2019-02-16

對於以Python作為技術棧的資料科學工作者,Jupyter是不得不提的資料包告工具。可能對於R社群而言,鼎鼎大名的ggplot2是常見的視覺化框架,而大家對於Python,以及Jupyter為核心的互動式報告的可個視化方案就並沒有那麼熟悉。本文試圖比較幾個常用的解決方案,方便大家選擇。

選擇標準

稱述式還是命令式

資料工作者使用的圖的類別,常見的就三類:GIS視覺化、網路視覺化和統計圖。因此,大多數場景下,我們並不想接觸非常底層的基於點、線、面的命令,所以,選擇一個好的封裝的框架相當重要。

當然,公認較好的封裝是基於《The Grammar of Graphics (Statistics and Computing)》一書,R中的ggplot2基本上就是一個很好的實現。我們基本上可以像用「自然語言」(Natural Language)一樣使用這些繪圖命令。我們姑且採用電腦科學領域的「陳述式」來表達這種繪圖方式。

相反,有時候,以下情形時,我們可能對於這種繪圖命令可能並不在意:

  1. 出圖相當簡單,要求繪製速度,一般大的框架較重(當然只是相對而言);
  2. 想要對細節做非常詳盡的微調,一般大框架在微調方面會相對複雜或者退縮成一句句命令;
  3. 是統計作圖視覺化的創新者,想要嘗試做出新的視覺化實踐。

這些情況下,顯然,簡單操作式並提供底層繪製命令的框架更讓人愉快,與上面類似,我們借用「命令式」描述這類框架。

是否互動

與傳統的交付靜態圖示不同,基於Web端的Jupter的一大好處就是可以繪製互動的圖示(最近的RNotebook也有實現),因此,是否選擇互動式,也是一個需要權衡的地方。

互動圖的優勢:

  1. 可以提供更多的資料維度和資訊;
  2. 使用者端可以做更多諸如放大、選取、轉存的操作;
  3. 可以交付BI工程師相應的JavaScript程式碼用以工程化;
  4. 效果上比較炫酷,考慮到報告接受者的特徵可以選擇。

非互動圖的優勢:

  1. 報告檔案直接匯出成靜態檔案時相對問題,不會因為轉換而損失資訊;
  2. 圖片可以與報告分離,必要時作為其他工作的成果;
  3. 不需要在執行Notebook時花很多世界載入各類前端框架。

是非核心互動

Jupyter上大多數命令通過以下方式獲取資料,而大多數繪圖方式事實上只是通過Notebook內的程式碼在Notebook與核心互動後展示出輸出結果。但ipywidgets框架則可以實現Code Cell中的程式碼與Notebook中的前端控制元件(比如按鈕等)繫結來進行操作核心,提供不同的繪圖結果,甚至某些繪圖框架的每個元素都可以直接和核心進行互動。

 

3262887070-59fae2a6967b6_articlex

用這些框架,可以搭建更復雜的Notebook的視覺化應用,但缺點是因為基於核心,所以在呈遞、展示報告時如果使用離線檔案時,這些互動就會無效。

框架羅列

matplotlib

最家喻戶曉的繪圖框架是matplotlib,它提供了幾乎所有python內靜態繪圖框架的底層命令。如果按照上面對視覺化框架的分法,matplotlib屬於非互動式的的「命令式」作圖框架。

3262887070-59fae2a6967b6_articlex

優點是相對較快,底層操作較多。缺點是語言繁瑣,內建預設風格不夠美觀。

matplotlib在jupyter中需要一些配置,可以展現更好的效果,詳情參見這篇文章.

ggplot和plotnine

值得一說,對於R遷移過來的人來說,ggplotplotnine簡直是福音,基本克隆了ggplot2所有語法。橫向比較的話,plotnine的效果更好。這兩個繪圖包的底層依舊是matplotlib,因此,在引用時別忘了使用%matplotlib inline語句。值得一說的是plotnine也移植了ggplot2中良好的配置語法和邏輯。

3262887070-59fae2a6967b6_articlex

Seaborn

seaborn準確上說屬於matplotlib的擴充套件包,在其上做了許多非常有用的封裝,基本上可以滿足大部分統計作圖的需求,以matplotlib+seaborn基本可以滿足大部分業務場景,語法也更加「陳述式」。

缺點是封裝較高,基本上API不提供的圖就完全不可繪製,對於各類圖的拼合也不適合;此外配置語句語法又迴歸「命令式」,相對複雜且不一致。

3262887070-59fae2a6967b6_articlex

plotly

plotly是跨平臺JavaScript互動式繪圖包,由於開發者的核心是javascript,所以整個語法類似於寫json配置,語法特質也介於「陳述式」和「命令式」之間,無服務版本是免費的。

有點是學習成本不高,可以很快將語句移植到javascript版本;缺點是語言相對繁瑣。

3262887070-59fae2a6967b6_articlex

注意:此框架在jupyter中使用需要使用init_notebook_mode()載入JavaScript框架。

bokeh

bokehpydata維護的比較具有潛力的開源互動視覺化框架。

值得一說的是,該框架同時提供底層語句和「陳述式」繪圖命令。相對來說語法也比較清楚,但其配置語句依舊有很多視覺化框架的問題,就是與「陳述式」命令不符,沒有合理的結構。此外,一些常見的互動效果都是以底層命令的方式使用的,因此如果要快速實現Dashboard或者作圖時就顯得較為不便了。

3262887070-59fae2a6967b6_articlex

bqplot

bqplot是基於ipywidgetsd3.js組合發展的核心互動式的視覺化框架。語法上採用了和matplotlib大致一致的語法已經相對封裝較高的「陳述式語法」。優點是直接和核心互動,可以使用大量控制元件來實現更多的影像處理,缺點也是直接的,離線文件則不會顯示任何圖案、控制元件也都失效。

3262887070-59fae2a6967b6_articlex

其他特殊需求的作圖

除了統計作圖,網路視覺化和GIS視覺化也是很常用的,在此只做一個簡單的羅列:

GIS類:

  • gmap:互動,使用google maps介面
  • ipyleaflet:互動,使用leaflet介面

網路類:

  • networkx:底層為matplotlib
  • plotly

總結

底層實現 互動方式 語法 語言結構 備註 推薦程度
matplotlib 命令式 底層語言 可以實現複雜底層操作 ★★★
gglot matplotlib 陳述式 ggplot2 建議選擇plotnine ★★
plotnine matplotlib 陳述式 ggplot2 完全移植ggplot2 ★★★★★
seaborn matplotlib 陳述式 高階語言 有很多有用的統計圖類的封裝;但不適合做圖拼裝 ★★★★★
plotly plotly.js 前端互動 介於命令式和陳述式之間 類似JavaScript 語法類似於json配置 ★★★★
bokeh 前端互動 命令、陳述式 同時有底層語言和高階語言 社群具有潛力 ★★★
bqplot d3.js 核心互動 命令、陳述式 有類似matplotlib底層語言,已經封裝好的高階語言 核心互動 ★★★★

相關文章