天天看點

手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

引言

最近,我一直在看美國德克薩斯州奧斯汀舉辦的scipy 2015會議上的一段視訊——“用blaze和bokeh建立python資料應用程式”,并且情不自禁地反複思考這兩個庫賦予世界各地使用python的資料科學家們的強大能力。在本文中,我将帶你體驗使用bokeh實作資料可視化的各種可能途徑,以及bokeh為什麼是每位資料科學家的必備“神器”。

什麼是bokeh?

bokeh是一個專門針對web浏覽器的呈現功能的互動式可視化python庫。這是bokeh與其它可視化庫最核心的差別。正如下圖所示,它說明了bokeh如何将資料展示到一個web浏覽器上的流程。

手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

正如你所看到的,bokeh捆綁了多種語言(python, r, lua和julia)。這些捆綁的語言産生了一個json檔案,這個檔案作為bokehjs(一個javascript庫)的一個輸入,之後會将資料展示到現代web浏覽器上。

bokeh可以像d3.js那樣建立簡潔漂亮的互動式可視化效果,即使是非常大型的或是流資料集也可以進行高效互動。bokeh可以幫助所有人快速友善地建立互動式的圖表、控制台以及資料應用程式。

bokeh能為像我這樣的資料科學家提供什麼?

我起初是作為一名商業智能從業者(bi professional)開始我的資料科學之旅的,随後,又逐漸學習了預測模組化,資料科學和機器學習。我主要使用qlikview和tableau進行資料可視化,用sas和python來做預測分析和資料分析。我幾乎沒有用過javascript。

是以,對于我之前所有的資料産品或想法,我隻能要麼将其外包要麼通過網站線框圖向别人展示,這兩者都不适合建立快速原型。現在,有了bokeh,我就可以繼續使用python,并且快速建立這些原型。

bokeh的優勢:

 bokeh允許你通過簡單的指令就可以快速建立複雜的統計圖,

 bokeh提供到各種媒體,如html,notebook文檔和伺服器的輸出

·我們也可以将bokeh可視化嵌入flask和django程式

 bokeh可以轉換寫在其它庫(如matplotlib, seaborn和ggplot)中的可視化

·bokeh能靈活地将互動式應用、布局和不同樣式選擇用于可視化

綜合bokeh的優點及其面臨的挑戰,bokeh是目前用于快速開發原型産品的理想工具。然而,如果你想在産品的環境下搞點新東西,d3.js可能仍然是你最好的選擇。

bokeh面臨的挑戰:

與任何即将到來的開源庫一樣,bokeh正在經曆不斷的變化和發展。是以,你今天寫的代碼可能将來并不能被完全再次使用。

與d3.js相比,bokeh的可視化選項相對較少。是以,短期内bokeh無法挑戰d3.js的霸主地位。

用bokeh實作可視化

bokeh提供了強大而靈活的功能,使其操作簡單并高度定制化。它為使用者提供了多個可視化界面,如下圖所示:

手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

圖表(charts):一個進階接口(high-level interface),用以簡單快速地建立複雜的統計圖表。

繪圖(plotting):一個中級接口(intermediate-level interface),以建構各種視覺符号為核心。

子產品(models):一個低級接口(low-level interface),為應用程式開發人員提供最大的靈活性。

本文中,我們僅涉及前兩個接口,圖表(charts)和繪圖(plotting)。

圖表

如上所述,它是一個進階接口,用于通過标準的可視化方式呈現資訊。這些方式包括箱形圖、柱狀圖、面積圖、熱圖、甜甜圈圖和許多其它圖形。你隻需輸入資料框(data frames)、numpy數組或字典就可以生成這些圖。

讓我們來看看建立一個圖表的通用方法:

1. 導入庫和函數/方法

2. 準備資料

3. 設定輸出模式(notebook文檔、web浏覽器或伺服器)

4. 建立圖表并選擇圖表的樣式(如果需要)

5. 可視化圖表

為了更好地了解這些步驟,讓我用下面的例子來示範一下:

圖表範例-1:使用bokeh建立一個柱狀圖并在web浏覽器上顯示

我們将遵循上述列出的步驟來建立一個圖表:

#導入庫函數 from bokeh.charts import bar, output_file, show #在電腦螢幕上使用 output_notebook來可視化資料 #準備資料 (模拟資料) data = {"y": [1, 2, 3, 4, 5]} #輸出到line.html output_file("lines.html", title="line plot example") #建立一個新的含有标題和軸标簽的視窗線上視窗 p = bar(data, title="line chart example", xlabel='x', ylabel='values', width=400, height=400) #顯示結果 show(p)
手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

在上面的圖表中,你可以看到頂部的工具選項(縮放、調整大小、重置、旋轉縮放),這些工具可以幫助你與圖表進行互動。同時,你也可以看到多個圖表選項(圖例、x軸名标注、y軸名标注、坐标網格線、寬度、高度等)和各種圖表的範例。

圖表範例-2:在notebook文檔中,利用箱線圖比較iris資料集中的萼片長度(sepal length)和花瓣長度(petal length)的分布情況

要建立這個可視化圖表,我首先要使用sklearn庫導入iris資料集。然後,按照上述步驟在ipython notebook文檔中進行圖表可視化。

#iris 資料集 from sklearn.datasets import load_iris import pandas as pd iris = load_iris() df=pd.dataframe(iris.data) df.columns=['petal_width','petal_length','sepal_width','sepal_length'] from bokeh.charts import boxplot, output_notebook, show data=df[['petal_length','sepal_length']] #輸出到電腦螢幕上 output_notebook() p = boxplot(data, width=400, height=400) # 顯示結果
手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

圖表範例-3:建立一個線圖到bokeh伺服器

在繪制可視化圖表到bokeh伺服器之前,你首先需要運作伺服器。

如果你使用的是conda包,你可以在任何目錄下使用運作指令“bokeh-server”。如果不是,“python ./bokeh-server”通常也可以。

在bokeh伺服器上進行可視化繪圖有多個優點:

圖表有更多的閱聽人

可對大資料集進行互動式可視化

可根據資料流自動更新圖表

建立控制台和應用程式

開始在bokeh伺服器上繪圖之前,我先運作了“bokeh-server”指令對其進行初始化,然後再運作用于可視化的相關指令。

手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

from bokeh.plotting import figure, output_server, show

output_server("line")

p = figure(plot_width=400, plot_height=400)

# 添加線渲染

p.line([5, 2, 3, 4, 5], [5, 7, 2, 4, 5], line_width=2)

手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆
繪圖

plotting是一個中級接口,是以建構視覺符号為核心的接口。在這裡,你可以綜合各種視覺元素(點、圓、線、更新檔和許多其它元素)和工具(懸停、縮放、儲存、重置和其它工具)來建立可視化。

使用bokeh的plotting接口建立的圖表自帶一組預設的工具和視覺效果。繪圖可按照以下步驟進行:

1.導入庫、方法或函數

2.選擇輸出方式(notebook文檔、web浏覽器、伺服器)

3.激活圖(類似matplotlib)

4.執行後續的繪圖操作,這将影響已經生成的圖形。

5.圖表可視化

為了更好地了解這些步驟,讓我舉例示範:

繪圖範例-1:在notebook文檔中建立二維散點圖(正方形标記)

from bokeh.plotting import figure, output_notebook, show # 輸出到電腦螢幕上 #添加一個矩形框,标有大小、顔色、alpha值 p.square([2, 5, 6, 4], [2, 3, 2, 1, 2], size=20, color="navy")
手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

同樣,你可以建立各種其它類型的圖:如線、角和圓弧、橢圓、圖像、更新檔以及許多其它的圖。

繪圖範例-2:将兩種視覺元素合并在一張圖中

p.line([1, 2, 3, 4, 5], [1, 2, 2, 4, 5], line_width=2) #added a line plot to existing figure
手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

繪圖範例-3:為上圖添加一個懸停工具和坐标軸标簽

from bokeh.models import hovertool, boxselecttool #for enabling tools #添加懸停工具 tools = [boxselecttool(), hovertool()] p = figure(plot_width=400, plot_height=400, tools=tools) p.square([2, 5, 6, 4], [2, 3, 2, 1, 2], size=20, color="navy", alpha=0.5) #顯示軸标簽 p.xaxis.axis_label = "x-axis" p.yaxis.axis_label = "y-axis"
手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

繪圖範例-4:使用緯度和經度資料來繪制印度地圖

注:我已經有一個csv格式的印度邊界的緯度和經度的多邊形資料。我将使用該資料來繪圖。

在這裡,我們将使用更新檔繪圖,讓我們看看下面的指令:

from bokeh.plotting import figure, show, output_notebook #導入經緯度坐标 india=pd.read_csv('e:/india.csv') del india['id'] india.index=['in0','in1','in2','in3','in4','in5'] #如果資料框中的坐标是字元類型轉換字元值為浮點值 for j in range(0,len(india)):  a = india['lats'][j]  india['lats'][j] = [float(i) for i in a[1:len(a)-1].split(",")]  a = india['lons'][j]  india['lons'][j] = [float(i) for i in a[1:len(a)-1].split(",")] # 建立畫闆 p = figure(plot_height=400, plot_width=400, toolbar_location="right",x_axis_type=none, y_axis_type=none) p.patches(xs=india['lons'], ys=india['lats'], fill_color="white",line_color="black", line_width=0.5) #可視化圖示
手把手|在Python中用Bokeh實作互動式資料可視化◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆

結語

在本文中,我們讨論了用bokeh建立可視化以及如何将可視化結果呈現在notebook文檔、html文檔以及bokeh伺服器上。我們還談到了如何使用繪圖接口建立個性化的可視化圖表,通過該功能,你可以将多種視覺元素結合到一起來展示資料資訊。

原文釋出時間為:2016-03-24

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号