美文网首页
学会使用Boken实现数据可视化(二)

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

作者: python与数据分析 | 来源:发表于2021-01-04 17:41 被阅读0次

【导语】通过上一节的学习,相信我们对bokeh有了一个基本的认识。那么这篇文章主要内容是通过bokeh实现布局,交互和标注。

一、布局

  • 横向布局:主要使用 row() 函数
  • 纵向布局:主要使用column() 函数
from bokeh.io import output_notebook, show
from bokeh.layouts import row, column
from bokeh.plotting import figure

output_notebook()

x = list(range(10))
y0 = x
y1 = [10 - i for i in x]
y2 = [abs(i - 3) for i in x]

# 绘制三张图
s1 = figure(plot_width=250, plot_height=250)
s1.circle(x, y0, size=12, color="pink", alpha=0.8)

s2 = figure(plot_width=250, plot_height=250)
s2.triangle(x, y1, size=12, color="lightblue", alpha=0.8)

s3 = figure(plot_width=250, plot_height=250)
s3.square(x, y2, size=12, color="orange", alpha=0.8)

layout = row(column(s1, s2), s3)
output_notebook()
show(layout)
  • 网格布局:gridplot()
  • 选项卡式布局:Panel(), Tabs()
from bokeh.io import output_notebook, show
from bokeh.layouts import gridplot
from bokeh.plotting import figure


x = list(range(11))
y0 = x
y1 = [10 - i for i in x]
y2 = [abs(i - 5) for i in x]

# 绘制三张图
s1 = figure(background_fill_color="#fafafa")
s1.circle(x, y0, size=12, alpha=0.8, color="#53777a")

s2 = figure(background_fill_color="#fafafa")
s2.triangle(x, y1, size=12, alpha=0.8, color="#c02942")

s3 = figure(background_fill_color="#fafafa")
s3.square(x, y2, size=12, alpha=0.8, color="#d95b43")

# 网格布局,并设置绘图大小
grid3 = gridplot([s1, s2, s3], ncols=2, plot_width=250, plot_height=250)

output_notebook()
show(grid3)

如果希望在两个可视化文件之间进行全尺寸切换,而不必将它们压缩到彼此相邻或重叠的位置,则选项卡式布局是一个不错的选择

from bokeh.io import show, output_notebook
from bokeh.models import Panel, Tabs
from bokeh.plotting import figure

p1 = figure(plot_width=300, plot_height=300)
p1.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)
tab1 = Panel(child=p1, title="circle")

p2 = figure(plot_width=300, plot_height=300)
p2.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=3, color="navy", alpha=0.5)
tab2 = Panel(child=p2, title="line")

output_notebook()
show(Tabs(tabs=[tab1, tab2]))

二、交互

  • 链接平移(Linked Panning)
  • 链接选择(Linked Brushing)

通常需要在许多绘图之间进行链接平移。启用此功能所需要做的就是在figure()函数中共享范围。运行下列代码,尝试拖拽其中任一绘图,看看其它绘制是否跟着一起动。

from bokeh.io import output_notebook, show
from bokeh.layouts import gridplot
from bokeh.plotting import figure


x = list(range(11))
y0 = x
y1 = [10-xx for xx in x]
y2 = [abs(xx-5) for xx in x]


# 绘制 s1
s1 = figure(plot_width=250, plot_height=250, title=None)
s1.circle(x, y0, size=10, color="navy", alpha=0.5)

# 绘制 s2 并且共享一个范围
s2 = figure(plot_width=250, plot_height=250, x_range=s1.x_range, y_range=s1.y_range, title=None)
s2.triangle(x, y1, size=10, color="firebrick", alpha=0.5)

# 绘制 s3 并且共享一个范围
s3 = figure(plot_width=250, plot_height=250, x_range=s1.x_range, title=None)
s3.square(x, y2, size=10, color="olive", alpha=0.5)

p = gridplot([[s1, s2, s3]], toolbar_location=None)

# 显示结果
output_notebook()
show(p)

运行下列代码,尝试使用绘图右上角的工具来对图进行操作,当鼠标悬停在工具图标上时,也会显示工具名称。

  • BoxSelectTool:名为 'box_select',在绘图区域上拖动鼠标来定义矩形选择区域;
  • LassoSelectTool:名为 'lasso_select',在绘图区域上拖动鼠标来定义要选择的任意区域。
from bokeh.io import output_notebook, show
from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure


x = list(range(-20, 21))
y0 = [abs(xx) for xx in x]
y1 = [xx**2 for xx in x]

# 创建图片共享的列数据源
source = ColumnDataSource(data=dict(x=x, y0=y0, y1=y1))

# 自定义选择外观
TOOLS = "box_select,lasso_select,help"

# create a new plot and add a renderer
left = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None)
left.circle('x', 'y0', source=source)

# create another new plot and add a renderer
right = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None)
right.circle('x', 'y1', source=source)

p = gridplot([[left, right]])

output_notebook()
show(p)

三、标注(注释)

  • 图例
    1)legend_label
    2)legend_group
  • 悬停工具

legend_label要为字形提供简单的显式标签,在绘图时,需要传入legend_label参数:如果给多个字形赋予了相同的标签,则它们将全部合并为带有该标签的单个图例项。

import numpy as np

from bokeh.plotting import figure, output_notebook, show

x = np.linspace(0, 4*np.pi, 100)
y = np.sin(x)


p = figure()

# 通过lagend_label参数添加图例标签
p.circle(x, y, legend_label="sin(x)")

p.line(x, y, legend_label="sin(x)")

p.line(x, 2*y, legend_label="2*sin(x)",
       line_dash=[4, 4], line_color="orange", line_width=2)

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")

output_notebook()
show(p)

legend_group()通常希望通过对数据源列中的值进行分组操作来生成多个图例项。 将legend_group参数传入字形方法,Bokeh可以执行这样的分组
from bokeh.models import ColumnDataSource
from bokeh.palettes import RdBu3
from bokeh.plotting import figure, output_notebook, show

c1 = RdBu3[2] # red
c2 = RdBu3[0] # blue
source = ColumnDataSource(dict(
    x=[1, 2, 3, 4, 5, 6],
    y=[2, 1, 2, 1, 2, 1],
    color=[c1, c2, c1, c2, c1, c2],
    label=['hi', 'lo', 'hi', 'lo', 'hi', 'lo']
))

p = figure(x_range=(0, 7), y_range=(0, 3), plot_height=300, tools='save')

# 图例字段与数据源中的 label 匹配
p.circle( x='x', y='y', radius=0.5, color='color', legend_group='label', source=source)

output_notebook()
show(p)

以@开头的字段名称与 ColumnDataSource 中的内容相关联。运行下方代码,尝试将鼠标悬停在点上面,看看是否有内容展示

from bokeh.plotting import ColumnDataSource, figure, output_notebook, show

source = ColumnDataSource(data=dict(
    x=['1', '5', '6', '3', '4', '7'],
    y=[123, 153, 89, 107, 98, 23],
    desc=['A', 'b', 'C', 'd', 'e','f'],
))

TOOLTIPS = [
    ("index", "$index"),
    ("(x,y)", "($x, $y)"),
    ("desc", "@desc"),
]

p = figure(plot_width=400, plot_height=400, tooltips=TOOLTIPS,
           title="Mouse over the dots")

p.circle('x', 'y', size=20, source=source)

output_notebook()
show(p)

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

相关文章

网友评论

      本文标题:学会使用Boken实现数据可视化(二)

      本文链接:https://www.haomeiwen.com/subject/zwmvoktx.html