python bokeh_使用Bokeh将交互性添加到您的Python图中

python bokeh

在本系列文章中,我将通过在每个Python绘图库中制作相同的多条图来研究不同Python绘图库的特性。 这次我主要关注Bokeh (发音为“ BOE-kay”)。

Bokeh中的绘图比其他一些绘图库中的绘图要复杂一些,但是付出额外的努力是有回报的。 Bokeh的设计既允许您在网络上创建自己的交互式图, 可以让您对交互的工作方式进行详细控制。 我将通过向本系列中一直使用的多条图添加工具提示来显示此信息。 它绘制了1966年至2020年英国大选结果的数据。

A zoomed-in view on the plot

图中的放大视图(©2019 Anvil

制作多条图

在继续之前,请注意,您可能需要调整Python环境以使此代码运行,包括以下内容。

  • 运行最新版本的Python( LinuxMacWindows的说明
  • 验证您正在运行与这些库一起使用的Python版本

数据可在线获得,并可使用熊猫导入:


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

现在我们准备出发了。

要制作多条图,您需要稍微整理一下数据。

原始数据如下所示:


   
   
>> print(long)
        year         party  seats
0       1966  Conservative    253
1       1970  Conservative    330
2   Feb 1974  Conservative    297
3   Oct 1974  Conservative    277
4       1979  Conservative    339
..       ...           ...    ...
103     2005        Others     30
104     2010        Others     29
105     2015        Others     80
106     2017        Others     59
107     2019        Others     72

[60 rows x 3 columns]

您可以将数据视为每种可能(year, party)组合的一系列seats值。 这正是Bokeh的想法。 您需要列出(year, party)元组的列表:


   
   
# Get a tuple for each possible (year, party) combination
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值只是座位:

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

Bokeh需要您将数据包装在它提供的某些对象中,以便为您提供交互功能。 将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 ) 

散景图上数据的可视表示形式称为字形,因此您已创建了一组条形字形。

调整图表的详细信息,以使其看起来像您想要的样子:


   
   
    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浏览器中将其打开。 结果如下:

A multi-bar plot in Bokeh

散景中的多条图(©2019 Anvil

它已经具有一些交互式功能,例如框缩放:

Bokeh's built-in box zoom

Bokeh的内置框缩放(©2019 Anvil

但是Bokeh的妙处在于您如何添加自己的交互性。 在下一节中,通过向工具栏添加工具提示来进行探索。

在工具栏上添加工具提示

要将工具提示添加到栏中,您只需创建一个HoverTool对象并将其添加到图形中:


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

参数定义工具提示上显示的数据。 变量@y@x指的是你传递到变量ColumnDataSource 。 您还可以使用其他一些值。 例如,光标上的情节的位置由下式给出$x$y (没有关系@x@y )。

结果如下:

The election graph, now with tooltips

选举图,现在带有工具提示(©2019 Anvil

借助BokehHTML输出,将绘图嵌入到Web应用程序中时,您可以获得完整的交互体验。 您可以在此处将此示例复制为Anvil应用(注意:Anvil需要注册才能使用)。

现在,您可以看到将所有数据包装在Bokeh中的诸如ColumnDataSource对象中的额外工作的原因。 作为回报,您可以相对轻松地添加交互性。

回到简单:​​Altair

Bokeh是四个最受欢迎的绘图库之一,本系列正在研究使它们中的每一个与众不同的地方

我还在寻找几个以其有趣的方法而引人注目的库。 接下来,我将看Altair ,它的声明性API意味着它可以绘制真正复杂的图而不会引起脑痛。


本文基于如何在Anvil的博客上使用Bokeh进行绘图,并经允许重复使用。

翻译自: https://opensource.com/article/20/5/bokeh-python

python bokeh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值