📜  使用 Bokeh 对数据进行交互式可视化(1)

📅  最后修改于: 2023-12-03 15:22:09.797000             🧑  作者: Mango

使用 Bokeh 对数据进行交互式可视化

Bokeh 是一个 Python 库,用于创建交互式的 Web 绘图。它可以构建各种类型的可视化图表,包括散点图、折线图、面积图、条形图、热图、Treemap(树形图)和网络图,等等。

为了更好地了解 Bokeh,我们将介绍以下主题:

安装 Bokeh

Bokeh 可以使用 pip 安装:

pip install bokeh
Bokeh 基础

Bokeh 的基本元素是绘图和图表。您可以使用 Bokeh 创建各种类型的图表,包括散点图、折线图和条形图等。

以下是 Bokeh 基础的示例代码:

from bokeh.plotting import figure, output_file, show

x = [1, 2, 3, 4, 5]
y = [5, 4, 3, 2, 1]

output_file("line.html")

p = figure(title="Simple line example", x_axis_label='x', y_axis_label='y')
p.line(x, y, legend_label="Line", line_width=2)

show(p)

此代码将 x 和 y 的值用于绘制一条线。它还包括创建一个标题和标签,以及将图表保存为 HTML 文件。

Bokeh 实例

以下是常见的 Bokeh 实例之一:散点图。

from bokeh.plotting import figure, output_file, show

x = [1, 2, 3, 4, 5]
y = [5, 4, 3, 2, 1]

output_file("scatter.html")

p = figure(title="Simple scatter example", x_axis_label='x', y_axis_label='y')
p.scatter(x, y, line_color=None)

show(p)

此代码将 x 和 y 的值用于创建散点图。它还包括创建一个标题和标签,以及将图表保存为 HTML 文件。

Bokeh 布局

Bokeh 的布局功能使您能够将多个图表组合在一个页面上。使用 Bokeh 的“ gridplot”函数可以创建网格布局,其中每个图表位于页面上的特定位置。

以下是使用 Bokeh 进行布局的示例代码:

from bokeh.plotting import figure, gridplot, output_file, show

x = [1, 2, 3, 4, 5]
y = [5, 4, 3, 2, 1]

output_file("layout.html")

p1 = figure(title="Line example", x_axis_label='x', y_axis_label='y')
p1.line(x, y, legend_label="Line", line_width=2)

p2 = figure(title="Scatter example", x_axis_label='x', y_axis_label='y')
p2.scatter(x, y, line_color=None)

p3 = figure(title="Bar example", x_axis_label='x', y_axis_label='y')
p3.vbar(x=x, top=y, width=0.5)

grid = gridplot([p1, p2, p3], ncols=2, plot_width=400, plot_height=400)

show(grid)

此代码将三个图表放置在一个网格中。每个图表都有自己的标题和标签,而且可以单独显示。每个图表都保存在一个 HTML 文件中,可以通过单击页面中的链接来查看它们。

Bokeh 交互式绘图

Bokeh 的交互式绘图功能使您能够通过鼠标单击、双击和拖动等方式对图表进行操作。可以双击图表上的点,以查看有关该点的详细信息,或者使用滑块控件更改图表中信息的时间点。

以下是 Bokeh 交互式绘图的示例代码:

from bokeh.layouts import column, row
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import figure, output_file, show

output_file("slider.html")

source = ColumnDataSource(data=dict(x=[1, 2, 3, 4, 5], y=[5, 4, 3, 2, 1]))

p = figure()
p.line('x', 'y', source=source)

slider = Slider(start=0, end=10, step=1, value=5)
slider.js_on_change('value', CustomJS(args=dict(source=source), code="""
    const data = source.data;
    const v = cb_obj.value;
    const x = data['x']
    const y = data['y']
    for (var i = 0; i < x.length; i++) {
        y[i] = Math.pow(x[i], v)
    }
    source.change.emit();
"""))

show(row(p, slider))

此代码创建了一个简单的折线图,并添加了一个滑块,可以更改绘制的数据。当用户更改滑块的值时,JavaScript 代码会重新计算 y 值。在 Bokeh 库中,可以将 JavaScript 代码和 Python 代码混合使用。

Bokeh 回调函数

Bokeh 回调函数在某些情况下很有用,例如当用户单击图表上的按钮或者拖动滑块时。回调函数可以告知 Bokeh 更新图表中的数据。

以下是 Bokeh 回调函数的示例代码:

from bokeh.layouts import column, row
from bokeh.models import CustomJS, ColumnDataSource, Button
from bokeh.plotting import figure, output_file, show

output_file("callback.html")

x = [1, 2, 3, 4, 5]
y = [5, 4, 3, 2, 1]

source = ColumnDataSource(data=dict(x=x, y=y))

p = figure()
p.line('x', 'y', source=source)

button = Button(label="Update", button_type="success")
button.js_on_click(CustomJS(args=dict(source=source), code="""
    const data = source.data;
    const y = data['y'];
    for (var i = 0; i < y.length; i++) {
        y[i] = Math.pow(y[i], 2)
    }
    source.change.emit();
"""))

show(column(p, button))

此代码创建了一个折线图和一个按钮。单击按钮时,将调用 JavaScript 回调函数,将 y 值的平方用于新的数据。该回调函数将触发 source.change.emit() 方法,这将通知 Bokeh 更新图表数据。

Bokeh 数据表格

Bokeh 支持 DataFrame 和其他数据表格格式。它可以轻松将数据表换成图表,并轻松地对数据进行可视化。

以下是 Bokeh 数据表格的示例代码:

from bokeh.plotting import figure, output_file, show
from bokeh.models import ColumnDataSource, DataTable, TableColumn

import pandas as pd

output_file("data_table.html")

data = {'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]}
df = pd.DataFrame(data)

source = ColumnDataSource(df)

columns = [
    TableColumn(field="x", title="X"),
    TableColumn(field="y", title="Y"),
]

data_table = DataTable(source=source, columns=columns, width=400, height=280)

p = figure(title="Simple line example", x_axis_label='x', y_axis_label='y')
p.line('x', 'y', source=source)

layout = [[data_table], [p]]

show(layout)

此代码创建了一个带有数据表格的图表。数据表格包含 x 和 y 值,而图表显示 x 和 y 的线。单击数据表格中的列标头将对列进行排序。

Bokeh 导出图像

Bokeh 支持将图表保存为常见的图像文件格式(例如 PNG、SVG 和 PDF),这些文件格式可以用于打印或在 Web 上共享。

以下是 Bokeh 导出图像的示例代码:

from bokeh.plotting import figure, output_file, export_png

x = [1, 2, 3, 4, 5]
y = [5, 4, 3, 2, 1]

output_file("image.png")

p = figure(title="Simple line example", x_axis_label='x', y_axis_label='y')
p.line(x, y, legend_label="Line", line_width=2)

export_png(p, filename="image.png")

此代码将绘制的图表保存为图像。您可以将“ export_png”替换为“ export_svg”或“ export_pdf”,以将图表保存为不同的图像格式。

Bokeh 其他功能

Bokeh 还有许多未在本文章中介绍的功能,例如:

  • 时间序列数据的可视化。
  • GeoJSON 数据的可视化。
  • 集成其他 JavaScript 可视化库,例如 D3.js。
  • 使用 Python 调用 JavaScript。

总之,Bokeh 是一种强大的 Python 库,可以用于创建交互式的 Web 绘图。它提供了许多功能和工具,可以轻松地创建各种各样的可视化图表。