学会使用Boken实现数据可视化(一)

【导语】大家可能熟悉Matplotlib可视化库,那么bokeh是什么呢。bokeh 是一个交互式的可视化库,为浏览器而生。它的绘图特点是通过对通用形状的操作构造出优雅、简洁的图,并提供高性能的交互。它的作用是帮助人们轻松快速的做出可交互的图、仪表板(Dashboard)以及数据应用。本篇文章偏基础,如想实现联动高级功能,可看后节内容。

bokeh绘图基础

为了满足不同人群对可视化的需求,bokeh 为用户设计了两种不同级别的接口:
bokeh.models 和 bokeh.plotting。

  1. bokeh.models :一个较底层的接口,为开发人员提供最大灵活性
  2. 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)

希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。

你可能感兴趣的:(学会使用Boken实现数据可视化(一))