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