編者按:Zalando數據工程師Alex Martinelli介紹了如何基于Plotly和ipywidgets在Jupyter Notebook中創建交互可視化內容。
本文介紹了如何在Jupyter Notebook中創建交互內容。所謂內容,主要指可視化內容。不過我們很快就會看到,這里的可視化內容不僅包括通常的圖表,還包括有助于探索數據的交互界面和動畫。
我將首先簡要介紹數據可視化,并更準確地定義本文中交互的范圍和含義。接著我將快速概覽所涉及的工具(Plotly和ipywidgets),順便提供一些關于Jupyter生態系統的通用建議。最后,我將展示一些具體的例子,這些例子大部分來自我的個人項目,我也將同時介紹這些交互內容對我項目的推進作用。這些例子是為了演示這類工具在Jupyter這一強大框架下的能力,希望這能推動你在自己的項目上嘗試這些技術,同時廣泛傳播這些技術。
介紹
數據可視化是一個優秀數據科學家(或任何涉及數據處理的角色)的核心技能之一。一方面,它能讓你(或者團隊的其他成員)更好地理解數據集的本質;另一方面,它能讓你向(懂技術、不懂技術的)外部受眾傳遞合適的消息。
在網上搜索“數據可視化”時,D3.js是推薦最多的庫之一。但有人斷言,你越是需要個性化的定制方法,就越有必要深入學習這一工具。相反,如果你的目標是快速、“標準”可視化,那么使用你選擇的編程語言提供的那些包也許更合適。
對Python生態系統而言,一開始免不了要和Matplotlib基礎構件打交道,接著可能擴大到高層替代庫(例如,Seaborn、Bokeh)。此外,特別是對數據科學圖表而言,越來越多人選擇使用Jupyter notebook。我相信這背后的主要原因是Jupyter將不同的媒介很好地封裝成了一個簡單的解決方案:代碼、文字、可視化。它不僅讓你的整個工作流程更方便、更有樂趣,還大大簡化了工作成果的分享(面向教學,也面向協作)。
我個人發現在Jupyter下使用Matplotlib + Seaborn組合最符合我的可視化需求,比Pandas自帶的繪圖功能要強。需要動畫功能時,Matplotlib 1.1版以來提供的簡單動畫框架提供了很好的易用性和結果美觀性的折衷。
不過,總有一個時刻,我們會發現自己需要更多。并不是說完全轉移到全新的工具,而是根據需求使用新的工具。在我看來,交互可以分為兩類:
交互式圖表:顯示當前瀏覽的特定數據點或區域的實時信息,高亮/隱藏特定內容。
用于內容交互的部件:從圖表擴展至其他媒介和內容,一般需要復雜UI元素以收集額外輸入。
目前而言,我發現Plotly能很好地解決第一個需求。至于后一個需求,我專門搜索了能夠方便地嵌入Jupyter的方案,這樣我就可以將任何notebook轉變為交互式面板。最后我找到了ipywidgets.
工具
在詳細介紹之前提到的工具之前,我想先分享一下個人使用的Python、Jupyter相關技術棧:
Anaconda(Python發行版)
使用virtualenv管理多個隔離的Python環境(或者使用Anaconda自帶的環境管理方案)
使用nbcondakernels管理Jupyter notebook的多個環境/核
使用Jupyter擴展定制Jupyter
Plotly
使用Plotly創建和分享交互式圖表極其便利。它甚至為圖表提供了無縫的web托管——公開內容免費托管,私有內容需付費。當然,如有必要,Plotly完全可以離線使用,直接在notebook中渲染交互式圖表,或者導出至(可交互)HTML文件。
如果這還不夠,Plotly還有兩個更有吸引力的特性:plot_mpl和cufflinks(cufflink意為袖扣)。
plot_mpl可以直接將純matplotlib圖像轉換為可交互的Plotly圖像(目前轉換尚不完美,但這一功能正在飛速改善)。
cufflinks讓Plotly可以自動綁定Pandas的dataframe。有了自動綁定,只需單次調用,便可基于dataframe內容得到高質量的數據可視化,例如自動解析日期數據,用恰當的格式顯示;推斷色調;管理標簽。
一般情況下,開始使用Plotly極其方便,只需運行:
pip install plotly
pip install cufflinks
接著為notebook選擇在線模式或離線模式。然后只需記住,.iplot()是在Jupyter中顯示內容的神奇語句。
ipywidgets
ipywidgets可以很方便地在notebook中創建交互界面。同樣,它很好地平衡了靈活性和易用性。
依照安裝步驟安裝ipywidgets后,就可以直接使用了。ipywidgets提供了供交互界面使用的組件,例如滑動條、復選框、按鈕、文本框,等等。
ipywidgets上手很容易,理解交互函數即可。交互函數能夠基于傳入的參數自動創建部件。例如,傳入一個布爾值參數會自動生成對應的復選框;傳入一個列表會自動生成下拉菜單。
ipywidgets的這些機制相當直截了當,官方文檔的說明也很棒,所以現在讓我們直接進入下一節。
作品展示
為了演示到目前為止講解的內容,也為了無恥地給自己打廣告,我將舉幾個源自我個人項目的例子。
我的所有項目都能在GitHub上找到(5agado),其中一些簡單項目是自包含、可復現的notebook。
例一:Fitbit面板
量化生活踐行者,以及想要為個人數據創建簡易面板(但不打算創建完整的面板應用)來探索數據、獲取洞見的人,也許會對這個項目特別感興趣。
我的Fitbit睡眠數據是一個需要可視化不同統計量(睡眠效率、睡眠得分、初次入睡時間等)、不同尺度(日、周、年等)數據的例子。使用Seaborn的刻面圖(factorplot)可以一次性可視化一組目標統計量。
這在簡單情形下很有用,但在復雜情形下就不那么有效了。例如,可視化每月的工作日數據:
上圖效果很差,呈現的信息很雜亂,而且對我這種色彩辨識能力不強的人而言,很難看清數據。相反,Plotly為這種情況提供了很好的解決方案,我們可以通過三種不同方式創建Plotly圖表:
直接將matplotlib圖像傳給iplot_mpl方法
使用Plotly語法從頭創建圖表
使用cufflinks直接基于Pandas的dataframe繪圖
就這一情形而言,最后一種方式最方便,也最準確。
例二:營養學數據庫
有時我們需要為一些結構化內容創建一個簡易界面。例如,我在探索營養學數據的時候就有這個需求。我探索的是USDA National Nutrient Database,它提供了豐富的數據,相對而言比較復雜,不過,使用Python和Pandas分析這個數據庫倒是不難。
有人也許會主張這其實屬于數據庫領域,使用SQL工具更合適。這個主張也許是對的,但我還是想展示下,在Jupyter下使用ipywidgets完成這一任務有多容易。相比使用單獨的數據庫系統,這可能是一個更好的臨時方案,特別是在數據探索階段。
從上圖我們可以看到,ipywidgets使用起來很方便,只需將原Python函數和需要自動映射到部件的參數傳給interact函數:
food(食物):空列表,將被轉換為文本框
nutrient(營養物質):將被轉換為下拉菜單
例三:動畫
如前所述,一旦具備了良好的工具,交互內容在各種場景下都有用武之地,例如動畫。
將(min,max,step)元組傳給interact函數后,能自動生成對應的滑動條。以不同的分辨率或復雜度查看動畫時,這樣一個簡單的整數滑動條很有幫助。例如,模擬[康威生命游戲]:
我們還可以定制界面,以快速瀏覽數據和相關分析結果。比如,我曾經可視化在貓狗數據集上訓練的CNN中間層的輸出:
現在有很多可視化的框架和工具,用于機器學習任務的特別多,不過,有時候像上面那樣快速粗暴的解決方案可以提供所有實際需要的信息和功能,同時節省大量時間。
結語
上面的例子僅僅使用了工具的基本功能。例如ipywidgets僅僅使用了interact函數和類型推斷。ipywidgets其實還支持自定義部件和部件組合,詳見官方文檔。
我希望這篇文章能夠展現這些工具的簡單性和可定制性。同時,我也希望能得到關于數據可視化工具方面的反饋,特別是包含3D建模和動畫的框架。
最后安利下dunovank/jupyter-themes,這個GitHub倉庫提供了許多Jupyter主題和可視化風格。
-
可視化
+關注
關注
1文章
1181瀏覽量
20897 -
數據集
+關注
關注
4文章
1205瀏覽量
24649
原文標題:Plotly與ipywidgets:交互可視化很容易
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論