探索 Bokeh:轻松创建交互式数据可视化的强盛工具

打印 上一主题 下一主题

主题 757|帖子 757|积分 2271

探索 Bokeh:轻松创建交互式数据可视化的强盛工具

在数据科学和数据分析范畴,交互式数据可视化是一项不可或缺的技能。Bokeh 是一个强盛的 Python 库,它可以资助我们快速构建高质量的交互式图表和仪表盘,同时兼具高性能和灵活性。本文将带您了解 Bokeh 的核心功能,并通过实际示例展示它的应用。

什么是 Bokeh?

Bokeh 是一个用于创建交互式、Web 优化数据可视化的 Python 库。它的核心特点包括:


  • 交互性:用户可以通过缩放、平移、悬停工具动态探索图表。
  • 易集成:支持嵌入 HTML 页面或 Jupyter Notebook。
  • 多功能性:提供从简单图表到复杂仪表盘的构建能力。
  • 高性能:适合处理大规模数据。

安装和入门

在开始使用 Bokeh 前,请先确保已安装库:
  1. pip install bokeh
复制代码
接下来,我们通过简单示例体验 Bokeh 的基本功能。

创建一个简单的折线图

以下代码展示了怎样使用 Bokeh 创建一个交互式折线图:
  1. from bokeh.plotting import figure, show
  2. from bokeh.io import output_notebook
  3. # 在 Jupyter Notebook 中显示输出
  4. output_notebook()
  5. # 数据
  6. x = [1, 2, 3, 4, 5]
  7. y = [6, 7, 2, 4, 5]
  8. # 创建图形对象
  9. p = figure(title="Simple Line Plot", x_axis_label='X-Axis', y_axis_label='Y-Axis')
  10. # 添加折线
  11. p.line(x, y, legend_label="Line", line_width=2)
  12. # 显示图表
  13. show(p)
复制代码
运行代码后,您将看到一个可以交互的折线图。通过工具栏,您可以缩放、平移并悬停检察详细数据。

使用 Pandas 数据快速绘图

Bokeh 与 Pandas 集成得很好,您可以直接将 Pandas DataFrame 作为数据源来绘图。比方:
  1. import pandas as pd
  2. from bokeh.plotting import figure, show
  3. # 创建示例 DataFrame
  4. data = {
  5.     "Month": ["Jan", "Feb", "Mar", "Apr", "May"],
  6.     "Sales": [100, 200, 150, 300, 400]
  7. }
  8. df = pd.DataFrame(data)
  9. # 创建柱状图
  10. p = figure(x_range=df["Month"], title="Monthly Sales", x_axis_label="Month", y_axis_label="Sales")
  11. # 添加柱状图
  12. p.vbar(x=df["Month"], top=df["Sales"], width=0.5, color="blue")
  13. # 显示图表
  14. show(p)
复制代码
这段代码天生了一个按月份表现销售额的柱状图,直观显现了数据变革。

添加交互工具

Bokeh 的强盛之处在于它的交互工具。以下示例展示了怎样添加悬停提示和缩放功能:
  1. from bokeh.models import HoverTool
  2. # 创建图形对象
  3. p = figure(title="Interactive Plot", x_axis_label="X", y_axis_label="Y", tools="pan,box_zoom,reset")
  4. # 添加数据
  5. p.circle(x, y, size=10, color="navy", alpha=0.5, legend_label="Data Points")
  6. # 添加悬停工具
  7. hover = HoverTool()
  8. hover.tooltips = [("X Value", "@x"), ("Y Value", "@y")]
  9. p.add_tools(hover)
  10. # 显示图表
  11. show(p)
复制代码
通过悬停,您可以动态检察每个数据点的详细信息。

构建多子图结构

Bokeh 提供了 gridplot 来构建多图结构,这在创建仪表盘时非常有用。比方:
  1. from bokeh.layouts import gridplot
  2. # 创建多个图表
  3. p1 = figure(title="Line Plot")
  4. p1.line(x, y, color="blue", legend_label="Line")
  5. p2 = figure(title="Scatter Plot")
  6. p2.scatter(x, y, size=10, color="green", legend_label="Points")
  7. # 使用 gridplot 布局
  8. layout = gridplot([[p1, p2]])
  9. show(layout)
复制代码
运行代码后,您将看到两个图表并排表现。

动态数据更新

Bokeh 允许实时更新图表,适合处理动态数据。比方,绘制一个实时更新的折线图:
  1. from bokeh.plotting import curdoc
  2. from bokeh.models import ColumnDataSource
  3. from bokeh.layouts import column
  4. from bokeh.plotting import figure
  5. import random
  6. # 数据源
  7. source = ColumnDataSource(data=dict(x=[], y=[]))
  8. # 创建图表
  9. p = figure(title="Real-Time Plot", x_axis_label="Time", y_axis_label="Value")
  10. p.line('x', 'y', source=source)
  11. # 更新数据的回调函数
  12. def update():
  13.     new_data = dict(x=[source.data['x'][-1] + 1 if source.data['x'] else 0], y=[random.randint(0, 10)])
  14.     source.stream(new_data, rollover=50)
  15. # 每秒更新一次数据
  16. curdoc().add_periodic_callback(update, 1000)
  17. # 显示布局
  18. curdoc().add_root(column(p))
复制代码
在运行这段代码时,图表会自动更新,表现实时天生的数据。

构建交互式仪表盘

以下代码展示了怎样创建一个交互式仪表盘,包含下拉菜单和滑块控件:
  1. from bokeh.models import Select, Slider
  2. from bokeh.layouts import row, column
  3. # 创建图表
  4. p = figure(title="Interactive Dashboard")
  5. line = p.line(x, y, legend_label="Line", line_width=2)
  6. # 创建交互控件
  7. select = Select(title="Line Color", value="blue", options=["blue", "green", "red"])
  8. slider = Slider(title="Line Width", value=2, start=1, end=10, step=1)
  9. # 控件回调函数
  10. def update(attr, old, new):
  11.     line.glyph.line_color = select.value
  12.     line.glyph.line_width = slider.value
  13. # 将控件与回调关联
  14. select.on_change("value", update)
  15. slider.on_change("value", update)
  16. # 布局
  17. layout = column(row(select, slider), p)
  18. curdoc().add_root(layout)
复制代码
运行代码后,您可以通过下拉菜单和滑块动态更改折线的颜色和宽度。

底子总结

Bokeh 是一个功能丰富且灵活的交互式可视化工具,非常适合快速开辟 Web 优化的可视化应用。通过 Bokeh,您可以轻松完成以下任务:


  • 天生各种交互式图表。
  • 构建多视图仪表盘。
  • 实现实时数据更新。
Bokeh 实战:从数据分析到交互式仪表盘开辟

在本节中,我们将通过一个完整的实战项目,展示怎样用 Bokeh 构建一个交互式仪表盘,实时可视化和分析销售数据。

实战场景

假设我们有一个电商平台的销售数据集,其中包含以下字段:


  • 订单日期(Order Date):订单的日期。
  • 销售额(Sales):订单金额。
  • 类别(Category):商品类别,如 “Electronics”、“Clothing” 等。
  • 地区(Region):订单所属地区。
目标是通过 Bokeh 构建一个交互式仪表盘,完成以下功能:

  • 按时间检察销售趋势
  • 对比不同商品类别的销售额占比
  • 表现各地区销售分布
  • 通过滑块和下拉菜单动态过滤数据

数据准备

首先,我们模拟一个数据集:
  1. import pandas as pd
  2. import numpy as np
  3. # 生成示例数据
  4. np.random.seed(42)
  5. dates = pd.date_range(start="2023-01-01", end="2023-12-31", freq="D")
  6. data = {
  7.     "Order Date": np.random.choice(dates, 1000),
  8.     "Sales": np.random.randint(100, 2000, 1000),
  9.     "Category": np.random.choice(["Electronics", "Clothing", "Home Appliances"], 1000),
  10.     "Region": np.random.choice(["North", "South", "East", "West"], 1000)
  11. }
  12. df = pd.DataFrame(data)
  13. # 转换日期格式
  14. df['Order Date'] = pd.to_datetime(df['Order Date'])
  15. df['Month'] = df['Order Date'].dt.to_period('M').astype(str)  # 生成月度字段
复制代码

构建图表

1. 月销售趋势图

  1. from bokeh.plotting import figure
  2. from bokeh.models import ColumnDataSource
  3. # 数据聚合
  4. monthly_sales = df.groupby("Month")["Sales"].sum().reset_index()
  5. monthly_sales_source = ColumnDataSource(monthly_sales)
  6. # 绘制折线图
  7. trend_plot = figure(
  8.     title="Monthly Sales Trend",
  9.     x_range=monthly_sales["Month"],
  10.     x_axis_label="Month",
  11.     y_axis_label="Total Sales",
  12.     tools="pan,box_zoom,reset,hover"
  13. )
  14. trend_plot.line(
  15.     x="Month",
  16.     y="Sales",
  17.     source=monthly_sales_source,
  18.     line_width=2,
  19.     color="blue",
  20.     legend_label="Monthly Sales"
  21. )
  22. trend_plot.legend.location = "top_left"
复制代码

2. 商品类别销售额占比图

  1. from bokeh.models import ColumnDataSource
  2. from bokeh.plotting import figure
  3. # 数据聚合
  4. category_sales = df.groupby("Category")["Sales"].sum().reset_index()
  5. category_source = ColumnDataSource(category_sales)
  6. # 绘制饼图
  7. from math import pi
  8. from bokeh.transform import cumsum
  9. from bokeh.palettes import Category20c
  10. category_sales["angle"] = category_sales["Sales"] / category_sales["Sales"].sum() * 2 * pi
  11. category_sales["color"] = Category20c[len(category_sales)]
  12. category_pie_plot = figure(
  13.     title="Sales by Category",
  14.     tools="hover",
  15.     tooltips="@Category: @Sales",
  16.     x_range=(-0.5, 1.0)
  17. )
  18. category_pie_plot.wedge(
  19.     x=0,
  20.     y=1,
  21.     radius=0.4,
  22.     start_angle=cumsum("angle", include_zero=True),
  23.     end_angle=cumsum("angle"),
  24.     line_color="white",
  25.     fill_color="color",
  26.     legend_field="Category",
  27.     source=ColumnDataSource(category_sales)
  28. )
  29. category_pie_plot.axis.visible = False
  30. category_pie_plot.grid.visible = False
复制代码

3. 地区销售分布柱状图

  1. # 数据聚合
  2. region_sales = df.groupby("Region")["Sales"].sum().reset_index()
  3. region_source = ColumnDataSource(region_sales)
  4. # 绘制柱状图
  5. region_bar_plot = figure(
  6.     title="Sales by Region",
  7.     x_range=region_sales["Region"],
  8.     x_axis_label="Region",
  9.     y_axis_label="Total Sales",
  10.     tools="pan,box_zoom,reset"
  11. )
  12. region_bar_plot.vbar(
  13.     x="Region",
  14.     top="Sales",
  15.     width=0.5,
  16.     color="blue",
  17.     source=region_source
  18. )
复制代码

添加交互控件

1. 滑块控件:按销售额过滤

  1. from bokeh.models import Slider
  2. # 创建滑块
  3. sales_slider = Slider(
  4.     title="Minimum Sales Filter",
  5.     start=100,
  6.     end=2000,
  7.     value=100,
  8.     step=100
  9. )
  10. # 滑块回调函数
  11. def update_data(attr, old, new):
  12.     filtered_data = df[df["Sales"] >= sales_slider.value]
  13.     updated_monthly_sales = filtered_data.groupby("Month")["Sales"].sum().reset_index()
  14.     monthly_sales_source.data = updated_monthly_sales
  15.     updated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()
  16.     region_source.data = updated_region_sales
  17. sales_slider.on_change("value", update_data)
复制代码
2. 下拉菜单:按类别过滤

  1. from bokeh.models import Select
  2. # 创建下拉菜单
  3. category_select = Select(
  4.     title="Select Category",
  5.     value="All",
  6.     options=["All"] + list(df["Category"].unique())
  7. )
  8. # 下拉菜单回调函数
  9. def filter_category(attr, old, new):
  10.     filtered_data = df[df["Category"] == category_select.value] if category_select.value != "All" else df
  11.     updated_monthly_sales = filtered_data.groupby("Month")["Sales"].sum().reset_index()
  12.     monthly_sales_source.data = updated_monthly_sales
  13.     updated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()
  14.     region_source.data = updated_region_sales
  15. category_select.on_change("value", filter_category)
复制代码

构建仪表盘结构

使用 Bokeh 的 layout 结构工具,将图表和控件组合在一起:
  1. from bokeh.layouts import column, row
  2. from bokeh.io import curdoc
  3. # 布局
  4. dashboard = column(
  5.     row(category_select, sales_slider),
  6.     trend_plot,
  7.     row(category_pie_plot, region_bar_plot)
  8. )
  9. # 添加到文档
  10. curdoc().add_root(dashboard)
  11. curdoc().title = "Sales Dashboard"
复制代码

启动 Bokeh 服务

将上述代码生存为 dashboard.py 文件,然后在终端运行以下命令:
  1. bokeh serve --show dashboard.py
复制代码
浏览器将自动打开,您可以通过滑块和下拉菜单动态过滤数据,并实时检察图表的更新。

总结

通过本次实战,我们完成了一个交互式仪表盘的开辟,展示了 Bokeh 的以下强盛功能:

  • 快速创建各种图表(折线图、饼图、柱状图)。
  • 使用控件(滑块、下拉菜单)动态过滤数据。
  • 构建多视图仪表盘并实时更新。
下一步,您可以尝试:


  • 将仪表盘部署到云端,让更多用户访问。
  • 添加更多控件和图表,丰富数据分析维度。
  • 与 Flask 或 Django 集成,构建完整的数据应用。
赶快用 Bokeh 动手构建属于自己的交互式数据可视化项目吧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表