本篇內容主要講解“怎么使用Bokeh為Python繪圖添加交互性”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用Bokeh為Python繪圖添加交互性”吧!
Bokeh 中的繪圖比其它一些繪圖庫要復雜一些,但付出的額外努力是有回報的。Bokeh 的設計既允許你在 Web 上創建自己的交互式繪圖,又能讓你詳細控制交互性如何工作。我將通過給我在這個系列中一直使用的多條形圖添加工具提示來展示這一點。它繪制了 1966 年到 2020 年之間英國選舉結果的數據。

在我們繼續之前,請注意你可能需要調整你的 Python 環境來讓這段代碼運行,包括以下:
運行最新版本的 Python (在 Linux、Mac 和 Windows 上的說明)
確認你運行的 Python 版本能與這些庫一起工作。
數據可在線獲得,可以用 Pandas 導入。
import pandas as pddf = pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')現在我們可以繼續進行了。
為了做出多條形圖,你需要對你的數據進行一下調整。
原始數據是這樣的:
>> print(long) year party seats0 1966 Conservative 2531 1970 Conservative 3302 Feb 1974 Conservative 2973 Oct 1974 Conservative 2774 1979 Conservative 339.. ... ... ...103 2005 Others 30104 2010 Others 29105 2015 Others 80106 2017 Others 59107 2019 Others 72 [60 rows x 3 columns]
你可以把數據看成是每一個可能的 (year, party) 組合的一系列 seats 值。這正是 Bokeh 處理的方式。你需要做一個 (year, party) 元組的列表:
# 得到每種可能的 (year, party) 組合的元組x = [(str(r[1]['year']), r[1]['party']) for r in df.iterrows()] # This comes out as [('1922', 'Conservative'), ('1923', 'Conservative'), ... ('2019', 'Others')]這些將是 x 值。y 值就是席位(seats)。
y = df['seats']
現在你的數據看起來應該像這樣:
x y('1966', 'Conservative') 253('1970', 'Conservative') 330('Feb 1974', 'Conservative') 297('Oct 1974', 'Conservative') 277('1979', 'Conservative') 339 ... ... ...('2005', 'Others') 30('2010', 'Others') 29('2015', 'Others') 80('2017', 'Others') 59('2019', 'Others') 72Bokeh 需要你將數據封裝在它提供的一些對象中,這樣它就能給你提供交互功能。將你的 x 和 y 數據結構封裝在一個 ColumnDataSource 對象中。
from bokeh.models import ColumnDataSource source = ColumnDataSource(data={'x': x, 'y': y})然后構造一個 Figure 對象,并傳入你用 FactorRange 對象封裝的 x 數據。
from bokeh.plotting import figure from bokeh.models import FactorRange p = figure(x_range=FactorRange(*x), width=2000, title="Election results")
你需要讓 Bokeh 創建一個顏色表,這是一個特殊的 DataSpec 字典,它根據你給它的顏色映射生成。在這種情況下,顏色表是一個簡單的黨派名稱和一個十六進制值之間的映射。
from bokeh.transform import factor_cmap cmap = { 'Conservative': '#0343df', 'Labour': '#e50000', 'Liberal': '#ffff14', 'Others': '#929591', } fill_color = factor_cmap('x', palette=list(cmap.values()), factors=list(cmap.keys()), start=1, end=2)現在你可以創建條形圖了:
p.vbar(x='x', top='y', width=0.9, source=source, fill_color=fill_color, line_color=fill_color)
Bokeh 圖表上數據的可視化形式被稱為“字形”,因此你已經創建了一組條形字形。
調整圖表的細節,讓它看起來像你想要的樣子。
p.y_range.start = 0 p.x_range.range_padding = 0.1 p.yaxis.axis_label = 'Seats' p.xaxis.major_label_orientation = 1 p.xgrid.grid_line_color = None
最后,告訴 Bokeh 你現在想看你的繪圖:
from bokeh.io import show show(p)
這將繪圖寫入一個 HTML 文件,并在默認的 Web 瀏覽器中打開它。如下結果:

它已經有了一些互動功能,比如盒子縮放。

但 Bokeh 的厲害之處在于你可以添加自己的交互性。在下一節中,我們通過在條形圖中添加工具提示來探索這個問題。
要在條形圖上添加工具提示,你只需要創建一個 HoverTool 對象并將其添加到你的繪圖中。
h = HoverTool(tooltips=[ ('Seats', '@y'), ('(Year, Party)', '(@x)') ]) p.add_tools(h)參數定義了哪些數據會顯示在工具提示上。變量 @y 和 @x 是指你傳入 ColumnDataSource 的變量。你還可以使用一些其他的值。例如,光標在圖上的位置由 $x 和 $y 給出(與 @x 和 @y 沒有關系)。
下面是結果:

借助 Bokeh 的 HTML 輸出,將繪圖嵌入到 Web 應用中時,你可以獲得完整的交互體驗。你可以在這里把這個例子復制為 Anvil 應用(注:Anvil 需要注冊才能使用)。
現在,你可以看到付出額外努力在 Bokeh 中將所有數據封裝在 ColumnDataSource 等對象的原因了。作為回報,你可以相對輕松地添加交互性。
到此,相信大家對“怎么使用Bokeh為Python繪圖添加交互性”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。