【导语】大家可能熟悉Matplotlib可视化库,那么bokeh是什么呢。bokeh 是一个交互式的可视化库,为浏览器而生。它的绘图特点是通过对通用形状的操作构造出优雅、简洁的图,并提供高性能的交互。它的作用是帮助人们轻松快速的做出可交互的图、仪表板(Dashboard)以及数据应用。本篇文章偏基础,如想实现联动高级功能,可看后节内容。
bokeh绘图基础
为了满足不同人群对可视化的需求,bokeh 为用户设计了两种不同级别的接口:
bokeh.models 和 bokeh.plotting。
- bokeh.models :一个较底层的接口,为开发人员提供最大灵活性
- bokeh.plotting:一个封装较全的接口,用户只需关注视觉上的形状组合即可
1、绘图
大多数用户可能希望使用后者,因此我们主要学习 bokeh.plotting 接口。
通常 bokeh 画图的流程包括这六步:
1. 准备画图数据
2. 导入相关库
3. 指定输出方式
4. 创建新画布
5. 添加字形
6. 显示结果
from bokeh.plotting import figure, output_notebook, show
from bokeh.io import reset_output
# 准备数据
x = [1, 2.5, 3, 2]
y = [2, 3, 1, 1.5]
# 创建新画布
p = figure(plot_width=500, plot_height=500,
x_axis_label='x', y_axis_label='y',
tools="pan,reset,save")
# 添加一个圆形的字形
p.circle(x, y, radius=0.3, alpha=0.5)
p.min_border = 40 # 设置四周边距一致
# 指定输出到 notebook 中
output_notebook()
# 输出到web网页
# output_file('circle.html')
# 显示结果
show(p)
字形说明:即各种图形的函数,比如折线图(line()),可自定义视觉属性,比如颜色(color)、图例(legend)等。
字形最常用的视觉参数包括:
1)x:横坐标
2)y:纵坐标
3)alpha:透明度(取值范围在0-1之间)
4)size:大小
5)fill_color:填充颜色
6)line_color:轮廓颜色
① 折线字形
折线字形最基本的函数是 line() 函数。它有这些常用参数:
line_width:线条宽度,默认是1;
line_color:线条颜色;
line_alpha:线条透明度;
line_dash:线型,可以是 “solid”(实线), “dashed”(虚线), “dotted”(点线), “dotdash”(点横线)等。
from bokeh.plotting import figure, output_notebook, show
# 准备画图所需的数据:折点的坐标数据
x = [1, 2, 3, 4, 5] # 表示每个折点的横坐标
y = [6, 7, 2, 4, 5] # 表示每个折点的纵坐标
# 指定输出在notebook中
output_notebook()
# 创建一个带有图标题和坐标轴标签的画布
p = figure(title="简单折线图", x_axis_label='x', y_axis_label='y', plot_width=500, plot_height=500)
# 添加一条折线
p.line(x, y, line_width=2, color='red', line_dash='dashdot')
# 设置图距四周的距离都是40
p.min_border = 40
# 显示结果
show(p)
import numpy as np
from bokeh.plotting import figure, output_notebook, show
# 准备数据:x 是等差数列,从 0 到 4*pi,一共100个元素
x = np.linspace(0, 4*np.pi, 100)
y = np.sin(x)
# 创建画布
p = figure(title="多条线的图", plot_width=500, plot_height=500)
# 画第一条线,添加圆形标记,设置图例是 "sin(x)",颜色线型都默认
p.line(x, y, legend_label="sin(x)")
p.circle(x, y, legend_label="sin(x)")
# 画第二条线,设置线型是虚线,图例是 "2*sin(x)",颜色是橘色,线宽是2
p.line(x, 2 * y, legend_label="2*sin(x)", line_dash='dashed', line_color="orange", line_width=2)
# 画第三条线,添加正方形标记,轮廓颜色是绿色,图例是 "3*sin(x)"
p.square(x, 3 * y, legend_label="3*sin(x)", fill_color=None, line_color="green")
p.line(x, 3 * y, legend_label="3*sin(x)", line_color="green")
p.min_border = 40
output_notebook()
show(p)
from bokeh.plotting import figure, output_notebook, show
# 准备数据:嵌套列表形式
x = [[1, 3, 2], [3, 4, 6, 6]]
y = [[2, 1, 4], [4, 7, 8, 5]]
p = figure(plot_width=500, plot_height=500)
# 一次画出多条线的函数
p.multi_line(x, y, color=["firebrick", "navy"], alpha=[0.8, 0.3], line_width=4)
p.min_border = 40
output_notebook()
show(p)
折线字形的方法小结:
1)line()
函数:可以画出单条线
2)多次调用line()
函数:画多条线
3)multi_line()
函数:一次画出多条线
② 块形字形
块形字形常用的函数是
patches()
,可以一次画出多个块形,这对于地理区域的绘制比较有用。
输入数据需要是嵌套列表形式,每个子列表表示一个块形的所有顶点坐标。
patches()` 函数常用的参数有:
fill_alpha:块形内部的透明度
fill_color:块形内部的颜色
line_alpha:块形轮廓的透明度
line_color:块形轮廓的颜色
line_alpha:块形轮廓的透明度
from bokeh.plotting import figure, output_notebook, show
xs = [[2, 2, 4], [2, 3, 4, 3]]
ys = [[3, 5, 5], [3, 4, 3, 2]]
p = figure()
p.patches(xs, ys,
fill_color=['coral', 'purple'],
line_color='white',
fill_alpha=0.6)
output_notebook()
show(p)
③ 条形图
bokeh 使用
hbar()
和vbar()
来画条形图(水平)和柱状图(垂直)。
hbar() 的常用参数有:
y:水平条形中心的 y 坐标
height:水平条形的高度
right:水平条形右边缘的 x 坐标
left:水平条形左边缘的 x 坐标
fill_color:条形的填充颜色
fill_alpha:条形内部的透明度
line_alpha:条形轮廓的透明度
line_color:条形轮廓的颜色
from bokeh.plotting import figure, output_notebook, show
plot = figure(plot_width=500, plot_height=500)
plot.hbar(y=[1, 2, 3, 4], height=0.5, left=0, right=[1, 2, 3, 2.5], color="skyblue")
output_notebook()
show(plot)
vbar() 的常用参数有:
x:竖直条形中心的 x 坐标
width:竖直条形的宽度
top:竖直条形顶部的 y 坐标
bottom:竖直条形底部的 y 坐标
fill_color:条形的填充颜色
fill_alpha:条形内部的透明度
line_alpha:条形轮廓的透明度
line_color:条形轮廓的颜色
from bokeh.plotting import figure, output_notebook, show
# 准备数据
x = [1, 2, 3, 4, 5] # 柱子所处的横坐标
y = [1.2, 2.5, 3.7, 1.5, 2.9] # 柱子的高度
p = figure(plot_width=500, plot_height=500)
# 画柱状图
p.vbar(x, top=y, width=0.5, bottom=0,
color="firebrick")
p.grid.visible = False # 去除网格线
p.min_border = 40
output_notebook()
show(p)
2、数据格式
数据可视化一定要准备数据,bokeh可以用作输入数据的数据格式有:
列表(直接提供数据)
Numpy 数组
DataFrame 的列
列数据源(Column Data Source)
# 导入需要的函数
from bokeh.plotting import figure, output_notebook, show
from bokeh.models import ColumnDataSource
# 数据组成的字典:键是字符串,值是列表
data = {'x_values': [1, 2, 3, 4, 5],
'y_values': [6, 7, 2, 3, 6]}
# 创建列数据源,参数是刚才创建的数据的字典,字典的键成为列数据源的列名。
source = ColumnDataSource(data=data)
# 创建画布
p = figure(plot_width=500, plot_height=500)
# 绘制圆形字形,参数 x,y 不是数据,而是列数据源的列名,source 参数指定列数据源作为数据
p.circle(x='x_values', y='y_values', source=source)
p.min_border = 40
output_notebook()
show(p)
3、自定义字形
① 自定义选择外观
# 导入相关函数
from bokeh.plotting import figure, output_notebook, show, ColumnDataSource
# 导入数据集
from bokeh.sampledata.iris import flowers as df
# 创建列数据源
source = ColumnDataSource(df)
# 创建画布,设置工具栏
p = figure(plot_width=500, plot_height=500, tools='box_select, lasso_select', title='选择区域')
# 创建字形,使用列数据源,指定选择外观
p.circle(x='petal_length', y='sepal_length', source=source,
selection_color='red', # 选中的颜色
nonselection_alpha=0.2, # 未选中的点的透明度
nonselection_color='grey') # 未选中的点的颜色
p.min_border = 40
output_notebook()
show(p)
现在,使用鼠标拖动画出一个区域,观察发生了什么?
可以发现,选择区域中的点全部变成了红色,其余点则变成了透明的灰色。
from bokeh.plotting import figure, output_notebook, show
p = figure(plot_width=500, plot_height=500, tools="tap", title="选择一个圆")
p.circle([1, 2, 3, 4, 5], [2, 5, 8, 2, 7], size=50,
# 设置选中字形的视觉属性
selection_color="firebrick",
# 设置未选中字形的视觉属性
nonselection_fill_alpha=0.2,
nonselection_fill_color="blue",
nonselection_line_color="firebrick",
nonselection_line_alpha=1.0)
p.min_border = 40
output_notebook()
show(p)
② 自定义悬停外观
# 导入相关函数
from bokeh.models import HoverTool
from bokeh.plotting import figure, output_notebook, show
import numpy as np
# 设置悬停工具,不显示每个点的提示,悬停处的垂直线上的点突出显示
hover = HoverTool(tooltips=None, mode='vline')
# 设置工具栏包含悬停显示工具和十字准线工具
p = figure(plot_width=500, plot_height=500, tools=[hover, 'crosshair'])
# x , y 分别是 500 个随机数组成的数组
x = np.random.random(size=500) # 返回[0,1)之间的随机数(浮点数)
y = np.random.random(size=500)
# 在字形函数中设置悬停字形的颜色
p.circle(x, y, size=15, hover_color='orange')
p.min_border = 40
output_notebook()
show(p)
③ 颜色映射
from bokeh.plotting import figure, output_notebook, show
# 导入相关函数
from bokeh.models import CategoricalColorMapper, ColumnDataSource
# 导入数据集
from bokeh.sampledata.iris import flowers as df
# 创建列数据源
source = ColumnDataSource(df)
# 创建类别颜色映射器,指定类别数据和调色板的颜色
mapper = CategoricalColorMapper(
factors=['setosa', 'virginica', 'versicolor'],
palette=['red', 'green', 'blue'])
# 创建画布
p = figure(x_axis_label='petal_length',
y_axis_label='sepal_length',
plot_width=500, plot_height=500)
# 添加圆形字形,指定color参数使用颜色映射器
p.circle('petal_length', 'sepal_length',
size=10, source=source,
color={'field': 'species', 'transform': mapper})
p.min_border = 40
output_notebook()
show(p)
希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。