溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Bokeh為Python繪圖添加交互性

發(fā)布時(shí)間:2021-11-01 16:51:08 來源:億速云 閱讀:150 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“怎么使用Bokeh為Python繪圖添加交互性”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么使用Bokeh為Python繪圖添加交互性”吧!

Bokeh 中的繪圖比其它一些繪圖庫要復(fù)雜一些,但付出的額外努力是有回報(bào)的。Bokeh  的設(shè)計(jì)既允許你在 Web  上創(chuàng)建自己的交互式繪圖,又能讓你詳細(xì)控制交互性如何工作。我將通過給我在這個(gè)系列中一直使用的多條形圖添加工具提示來展示這一點(diǎn)。它繪制了 1966  年到 2020 年之間英國選舉結(jié)果的數(shù)據(jù)。

怎么使用Bokeh為Python繪圖添加交互性

制作多條形圖

在我們繼續(xù)之前,請注意你可能需要調(diào)整你的 Python 環(huán)境來讓這段代碼運(yùn)行,包括以下:

  • 運(yùn)行最新版本的 Python (在 Linux、Mac 和 Windows 上的說明)

  • 確認(rèn)你運(yùn)行的 Python 版本能與這些庫一起工作。

數(shù)據(jù)可在線獲得,可以用 Pandas 導(dǎo)入。

import pandas as pddf = pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')

現(xiàn)在我們可以繼續(xù)進(jìn)行了。

為了做出多條形圖,你需要對你的數(shù)據(jù)進(jìn)行一下調(diào)整。

原始數(shù)據(jù)是這樣的:

>> 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]

你可以把數(shù)據(jù)看成是每一個(gè)可能的 (year, party) 組合的一系列 seats 值。這正是 Bokeh 處理的方式。你需要做一個(gè) (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']

現(xiàn)在你的數(shù)據(jù)看起來應(yīng)該像這樣:

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')              72

Bokeh 需要你將數(shù)據(jù)封裝在它提供的一些對象中,這樣它就能給你提供交互功能。將你的 x 和 y 數(shù)據(jù)結(jié)構(gòu)封裝在一個(gè) ColumnDataSource 對象中。

    from bokeh.models import ColumnDataSource     source = ColumnDataSource(data={'x': x, 'y': y})

然后構(gòu)造一個(gè) Figure 對象,并傳入你用 FactorRange 對象封裝的 x 數(shù)據(jù)。

    from bokeh.plotting import figure    from bokeh.models import FactorRange       p = figure(x_range=FactorRange(*x), width=2000, title="Election results")

你需要讓 Bokeh 創(chuàng)建一個(gè)顏色表,這是一個(gè)特殊的 DataSpec 字典,它根據(jù)你給它的顏色映射生成。在這種情況下,顏色表是一個(gè)簡單的黨派名稱和一個(gè)十六進(jìn)制值之間的映射。

    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)

現(xiàn)在你可以創(chuàng)建條形圖了:

    p.vbar(x='x', top='y', width=0.9, source=source, fill_color=fill_color, line_color=fill_color)

Bokeh 圖表上數(shù)據(jù)的可視化形式被稱為“字形glyphs”,因此你已經(jīng)創(chuàng)建了一組條形字形。

調(diào)整圖表的細(xì)節(jié),讓它看起來像你想要的樣子。

    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 你現(xiàn)在想看你的繪圖:

   from bokeh.io import show    show(p)

這將繪圖寫入一個(gè) HTML 文件,并在默認(rèn)的 Web 瀏覽器中打開它。如下結(jié)果:

怎么使用Bokeh為Python繪圖添加交互性

它已經(jīng)有了一些互動(dòng)功能,比如盒子縮放。

怎么使用Bokeh為Python繪圖添加交互性

但 Bokeh 的厲害之處在于你可以添加自己的交互性。在下一節(jié)中,我們通過在條形圖中添加工具提示來探索這個(gè)問題。

給條形圖添加工具提示

要在條形圖上添加工具提示,你只需要?jiǎng)?chuàng)建一個(gè) HoverTool 對象并將其添加到你的繪圖中。

    h = HoverTool(tooltips=[        ('Seats', '@y'),        ('(Year, Party)', '(@x)')    ])    p.add_tools(h)

參數(shù)定義了哪些數(shù)據(jù)會(huì)顯示在工具提示上。變量 @y 和 @x 是指你傳入 ColumnDataSource 的變量。你還可以使用一些其他的值。例如,光標(biāo)在圖上的位置由 $x 和 $y 給出(與 @x 和 @y 沒有關(guān)系)。

下面是結(jié)果:

怎么使用Bokeh為Python繪圖添加交互性

借助 Bokeh 的 HTML 輸出,將繪圖嵌入到 Web 應(yīng)用中時(shí),你可以獲得完整的交互體驗(yàn)。你可以在這里把這個(gè)例子復(fù)制為 Anvil 應(yīng)用(注:Anvil 需要注冊才能使用)。

現(xiàn)在,你可以看到付出額外努力在 Bokeh 中將所有數(shù)據(jù)封裝在 ColumnDataSource 等對象的原因了。作為回報(bào),你可以相對輕松地添加交互性。

到此,相信大家對“怎么使用Bokeh為Python繪圖添加交互性”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI