python bokeh
在本系列文章中,我将通过在每个Python绘图库中制作相同的多条图来研究不同Python绘图库的特性。 这次我主要关注Bokeh (发音为“ BOE-kay”)。
Bokeh中的绘图比其他一些绘图库中的绘图要复杂一些,但是付出额外的努力是有回报的。 Bokeh的设计既允许您在网络上创建自己的交互式图, 也可以让您对交互的工作方式进行详细控制。 我将通过向本系列中一直使用的多条图添加工具提示来显示此信息。 它绘制了1966年至2020年英国大选结果的数据。
制作多条图
在继续之前,请注意,您可能需要调整Python环境以使此代码运行,包括以下内容。
- 运行最新版本的Python( Linux , Mac和Windows的说明 )
- 验证您正在运行与这些库一起使用的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浏览器中将其打开。 结果如下:
它已经具有一些交互式功能,例如框缩放:
但是Bokeh的妙处在于您如何添加自己的交互性。 在下一节中,通过向工具栏添加工具提示来进行探索。
在工具栏上添加工具提示
要将工具提示添加到栏中,您只需创建一个HoverTool
对象并将其添加到图形中:
h
= HoverTool
( tooltips
=
[
(
'Seats'
,
'@y'
)
,
(
'(Year, Party)'
,
'(@x)'
)
]
)
p.
add_tools
( h
)
参数定义工具提示上显示的数据。 变量@y
和@x
指的是你传递到变量ColumnDataSource
。 您还可以使用其他一些值。 例如,光标上的情节的位置由下式给出$x
和$y
(没有关系@x
和@y
)。
结果如下:
借助BokehHTML输出,将绘图嵌入到Web应用程序中时,您可以获得完整的交互体验。 您可以在此处将此示例复制为Anvil应用(注意:Anvil需要注册才能使用)。
现在,您可以看到将所有数据包装在Bokeh中的诸如ColumnDataSource
对象中的额外工作的原因。 作为回报,您可以相对轻松地添加交互性。
回到简单:Altair
Bokeh是四个最受欢迎的绘图库之一,本系列正在研究使它们中的每一个与众不同的地方 。
我还在寻找几个以其有趣的方法而引人注目的库。 接下来,我将看Altair ,它的声明性API意味着它可以绘制真正复杂的图而不会引起脑痛。
本文基于如何在Anvil的博客上使用Bokeh进行绘图,并经允许重复使用。
python bokeh