日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用Bokeh為你的Python繪圖添加交互性

在 Bokeh 中繪圖比其他一些繪圖庫(kù)要復(fù)雜一些,但付出額外的努力是有回報(bào)的。

在這一系列文章中,我通過(guò)在每個(gè) Python 繪圖庫(kù)中制作相同的多條形繪圖,來(lái)研究不同 Python 繪圖庫(kù)的特性。這次我重點(diǎn)介紹的是 Bokeh(讀作 “BOE-kay”)。

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

繪圖的放大視圖(?2019 年 Anvil)

制作多條形圖

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

  • 運(yùn)行最新版本的 Python (在 Linux、Mac 和 Windows 上的說(shuō)明)
  • 確認(rèn)你運(yùn)行的 Python 版本能與這些庫(kù)一起工作。

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

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

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

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

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

 
 
 
 
  1. >> print(long)
  2. year party seats
  3. 0 1966 Conservative 253
  4. 1 1970 Conservative 330
  5. 2 Feb 1974 Conservative 297
  6. 3 Oct 1974 Conservative 277
  7. 4 1979 Conservative 339
  8. .. ... ... ...
  9. 103 2005 Others 30
  10. 104 2010 Others 29
  11. 105 2015 Others 80
  12. 106 2017 Others 59
  13. 107 2019 Others 72
  14.  
  15. [60 rows x 3 columns]

你可以把數(shù)據(jù)看成是每一個(gè)可能的 (year, party) 組合的一系列 seats 值。這正是 Bokeh 處理的方式。你需要做一個(gè) (year, party) 元組的列表:

 
 
 
 
  1. # 得到每種可能的 (year, party) 組合的元組
  2. x = [(str(r[1]['year']), r[1]['party']) for r in df.iterrows()]
  3. # This comes out as [('1922', 'Conservative'), ('1923', 'Conservative'), ... ('2019', 'Others')]

這些將是 x 值。y 值就是席位(seats)。

 
 
 
 
  1. y = df['seats']

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

 
 
 
 
  1. x                               y
  2. ('1966', 'Conservative')        253
  3. ('1970', 'Conservative')        330
  4. ('Feb 1974', 'Conservative')    297
  5. ('Oct 1974', 'Conservative')    277
  6. ('1979', 'Conservative')        339
  7.  ...      ...                   ...
  8. ('2005', 'Others')              30
  9. ('2010', 'Others')              29
  10. ('2015', 'Others')              80
  11. ('2017', 'Others')              59
  12. ('2019', 'Others')              72

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

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

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

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

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

 
 
 
 
  1.     from bokeh.transform import factor_cmap
  2.  
  3.     cmap = {
  4.         'Conservative': '#0343df',
  5.         'Labour': '#e50000',
  6.         'Liberal': '#ffff14',
  7.         'Others': '#929591',
  8.     }
  9.     fill_color = factor_cmap('x', palette=list(cmap.values()), factors=list(cmap.keys()), start=1, end=2)

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

 
 
 
 
  1.     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é),讓它看起來(lái)像你想要的樣子。

 
 
 
 
  1.     p.y_range.start = 0
  2.     p.x_range.range_padding = 0.1
  3.     p.yaxis.axis_label = 'Seats'
  4.     p.xaxis.major_label_orientation = 1
  5.     p.xgrid.grid_line_color = None

最后,告訴 Bokeh 你現(xiàn)在想看你的繪圖:

 
 
 
 
  1.    from bokeh.io import show
  2.  
  3.    show(p)

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

Bokeh 中的多條形繪圖(?2019年Anvil)

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

Bokeh 內(nèi)置的盒子縮放(?2019Anvil)

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

給條形圖添加工具提示

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

 
 
 
 
  1.     h = HoverTool(tooltips=[
  2.         ('Seats', '@y'),
  3.         ('(Year, Party)', '(@x)')
  4.     ])
  5.     p.add_tools(h)

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

下面是結(jié)果:

選舉圖,現(xiàn)在帶有工具提示(? 2019 Anvil)

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

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

回歸簡(jiǎn)單:Altair

Bokeh 是四大最流行的繪圖庫(kù)之一,本系列將研究它們各自的特別之處。

我也在研究幾個(gè)因其有趣的方法而脫穎而出的庫(kù)。接下來(lái),我將看看 Altair,它的聲明式 API 意味著它可以做出非常復(fù)雜的繪圖,而不會(huì)讓你頭疼。


網(wǎng)頁(yè)題目:使用Bokeh為你的Python繪圖添加交互性
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/djoheoc.html