探索 Bokeh:轻松创建交互式数据可视化的强盛工具
在数据科学和数据分析范畴,交互式数据可视化是一项不可或缺的技能。Bokeh 是一个强盛的 Python 库,它可以资助我们快速构建高质量的交互式图表和仪表盘,同时兼具高性能和灵活性。本文将带您了解 Bokeh 的核心功能,并通过实际示例展示它的应用。
什么是 Bokeh?
Bokeh 是一个用于创建交互式、Web 优化数据可视化的 Python 库。它的核心特点包括:
- 交互性:用户可以通过缩放、平移、悬停工具动态探索图表。
- 易集成:支持嵌入 HTML 页面或 Jupyter Notebook。
- 多功能性:提供从简单图表到复杂仪表盘的构建能力。
- 高性能:适合处理大规模数据。
安装和入门
在开始使用 Bokeh 前,请先确保已安装库:
接下来,我们通过简单示例体验 Bokeh 的基本功能。
创建一个简单的折线图
以下代码展示了怎样使用 Bokeh 创建一个交互式折线图:
- from bokeh.plotting import figure, show
- from bokeh.io import output_notebook
- # 在 Jupyter Notebook 中显示输出
- output_notebook()
- # 数据
- x = [1, 2, 3, 4, 5]
- y = [6, 7, 2, 4, 5]
- # 创建图形对象
- p = figure(title="Simple Line Plot", x_axis_label='X-Axis', y_axis_label='Y-Axis')
- # 添加折线
- p.line(x, y, legend_label="Line", line_width=2)
- # 显示图表
- show(p)
复制代码 运行代码后,您将看到一个可以交互的折线图。通过工具栏,您可以缩放、平移并悬停检察详细数据。
使用 Pandas 数据快速绘图
Bokeh 与 Pandas 集成得很好,您可以直接将 Pandas DataFrame 作为数据源来绘图。比方:
- import pandas as pd
- from bokeh.plotting import figure, show
- # 创建示例 DataFrame
- data = {
- "Month": ["Jan", "Feb", "Mar", "Apr", "May"],
- "Sales": [100, 200, 150, 300, 400]
- }
- df = pd.DataFrame(data)
- # 创建柱状图
- p = figure(x_range=df["Month"], title="Monthly Sales", x_axis_label="Month", y_axis_label="Sales")
- # 添加柱状图
- p.vbar(x=df["Month"], top=df["Sales"], width=0.5, color="blue")
- # 显示图表
- show(p)
复制代码 这段代码天生了一个按月份表现销售额的柱状图,直观显现了数据变革。
添加交互工具
Bokeh 的强盛之处在于它的交互工具。以下示例展示了怎样添加悬停提示和缩放功能:
- from bokeh.models import HoverTool
- # 创建图形对象
- p = figure(title="Interactive Plot", x_axis_label="X", y_axis_label="Y", tools="pan,box_zoom,reset")
- # 添加数据
- p.circle(x, y, size=10, color="navy", alpha=0.5, legend_label="Data Points")
- # 添加悬停工具
- hover = HoverTool()
- hover.tooltips = [("X Value", "@x"), ("Y Value", "@y")]
- p.add_tools(hover)
- # 显示图表
- show(p)
复制代码 通过悬停,您可以动态检察每个数据点的详细信息。
构建多子图结构
Bokeh 提供了 gridplot 来构建多图结构,这在创建仪表盘时非常有用。比方:
- from bokeh.layouts import gridplot
- # 创建多个图表
- p1 = figure(title="Line Plot")
- p1.line(x, y, color="blue", legend_label="Line")
- p2 = figure(title="Scatter Plot")
- p2.scatter(x, y, size=10, color="green", legend_label="Points")
- # 使用 gridplot 布局
- layout = gridplot([[p1, p2]])
- show(layout)
复制代码 运行代码后,您将看到两个图表并排表现。
动态数据更新
Bokeh 允许实时更新图表,适合处理动态数据。比方,绘制一个实时更新的折线图:
- from bokeh.plotting import curdoc
- from bokeh.models import ColumnDataSource
- from bokeh.layouts import column
- from bokeh.plotting import figure
- import random
- # 数据源
- source = ColumnDataSource(data=dict(x=[], y=[]))
- # 创建图表
- p = figure(title="Real-Time Plot", x_axis_label="Time", y_axis_label="Value")
- p.line('x', 'y', source=source)
- # 更新数据的回调函数
- def update():
- new_data = dict(x=[source.data['x'][-1] + 1 if source.data['x'] else 0], y=[random.randint(0, 10)])
- source.stream(new_data, rollover=50)
- # 每秒更新一次数据
- curdoc().add_periodic_callback(update, 1000)
- # 显示布局
- curdoc().add_root(column(p))
复制代码 在运行这段代码时,图表会自动更新,表现实时天生的数据。
构建交互式仪表盘
以下代码展示了怎样创建一个交互式仪表盘,包含下拉菜单和滑块控件:
- from bokeh.models import Select, Slider
- from bokeh.layouts import row, column
- # 创建图表
- p = figure(title="Interactive Dashboard")
- line = p.line(x, y, legend_label="Line", line_width=2)
- # 创建交互控件
- select = Select(title="Line Color", value="blue", options=["blue", "green", "red"])
- slider = Slider(title="Line Width", value=2, start=1, end=10, step=1)
- # 控件回调函数
- def update(attr, old, new):
- line.glyph.line_color = select.value
- line.glyph.line_width = slider.value
- # 将控件与回调关联
- select.on_change("value", update)
- slider.on_change("value", update)
- # 布局
- layout = column(row(select, slider), p)
- curdoc().add_root(layout)
复制代码 运行代码后,您可以通过下拉菜单和滑块动态更改折线的颜色和宽度。
底子总结
Bokeh 是一个功能丰富且灵活的交互式可视化工具,非常适合快速开辟 Web 优化的可视化应用。通过 Bokeh,您可以轻松完成以下任务:
- 天生各种交互式图表。
- 构建多视图仪表盘。
- 实现实时数据更新。
Bokeh 实战:从数据分析到交互式仪表盘开辟
在本节中,我们将通过一个完整的实战项目,展示怎样用 Bokeh 构建一个交互式仪表盘,实时可视化和分析销售数据。
实战场景
假设我们有一个电商平台的销售数据集,其中包含以下字段:
- 订单日期(Order Date):订单的日期。
- 销售额(Sales):订单金额。
- 类别(Category):商品类别,如 “Electronics”、“Clothing” 等。
- 地区(Region):订单所属地区。
目标是通过 Bokeh 构建一个交互式仪表盘,完成以下功能:
- 按时间检察销售趋势。
- 对比不同商品类别的销售额占比。
- 表现各地区销售分布。
- 通过滑块和下拉菜单动态过滤数据。
数据准备
首先,我们模拟一个数据集:
- import pandas as pd
- import numpy as np
- # 生成示例数据
- np.random.seed(42)
- dates = pd.date_range(start="2023-01-01", end="2023-12-31", freq="D")
- data = {
- "Order Date": np.random.choice(dates, 1000),
- "Sales": np.random.randint(100, 2000, 1000),
- "Category": np.random.choice(["Electronics", "Clothing", "Home Appliances"], 1000),
- "Region": np.random.choice(["North", "South", "East", "West"], 1000)
- }
- df = pd.DataFrame(data)
- # 转换日期格式
- df['Order Date'] = pd.to_datetime(df['Order Date'])
- df['Month'] = df['Order Date'].dt.to_period('M').astype(str) # 生成月度字段
复制代码 构建图表
1. 月销售趋势图
- from bokeh.plotting import figure
- from bokeh.models import ColumnDataSource
- # 数据聚合
- monthly_sales = df.groupby("Month")["Sales"].sum().reset_index()
- monthly_sales_source = ColumnDataSource(monthly_sales)
- # 绘制折线图
- trend_plot = figure(
- title="Monthly Sales Trend",
- x_range=monthly_sales["Month"],
- x_axis_label="Month",
- y_axis_label="Total Sales",
- tools="pan,box_zoom,reset,hover"
- )
- trend_plot.line(
- x="Month",
- y="Sales",
- source=monthly_sales_source,
- line_width=2,
- color="blue",
- legend_label="Monthly Sales"
- )
- trend_plot.legend.location = "top_left"
复制代码 2. 商品类别销售额占比图
- from bokeh.models import ColumnDataSource
- from bokeh.plotting import figure
- # 数据聚合
- category_sales = df.groupby("Category")["Sales"].sum().reset_index()
- category_source = ColumnDataSource(category_sales)
- # 绘制饼图
- from math import pi
- from bokeh.transform import cumsum
- from bokeh.palettes import Category20c
- category_sales["angle"] = category_sales["Sales"] / category_sales["Sales"].sum() * 2 * pi
- category_sales["color"] = Category20c[len(category_sales)]
- category_pie_plot = figure(
- title="Sales by Category",
- tools="hover",
- tooltips="@Category: @Sales",
- x_range=(-0.5, 1.0)
- )
- category_pie_plot.wedge(
- x=0,
- y=1,
- radius=0.4,
- start_angle=cumsum("angle", include_zero=True),
- end_angle=cumsum("angle"),
- line_color="white",
- fill_color="color",
- legend_field="Category",
- source=ColumnDataSource(category_sales)
- )
- category_pie_plot.axis.visible = False
- category_pie_plot.grid.visible = False
复制代码 3. 地区销售分布柱状图
- # 数据聚合
- region_sales = df.groupby("Region")["Sales"].sum().reset_index()
- region_source = ColumnDataSource(region_sales)
- # 绘制柱状图
- region_bar_plot = figure(
- title="Sales by Region",
- x_range=region_sales["Region"],
- x_axis_label="Region",
- y_axis_label="Total Sales",
- tools="pan,box_zoom,reset"
- )
- region_bar_plot.vbar(
- x="Region",
- top="Sales",
- width=0.5,
- color="blue",
- source=region_source
- )
复制代码 添加交互控件
1. 滑块控件:按销售额过滤
- from bokeh.models import Slider
- # 创建滑块
- sales_slider = Slider(
- title="Minimum Sales Filter",
- start=100,
- end=2000,
- value=100,
- step=100
- )
- # 滑块回调函数
- def update_data(attr, old, new):
- filtered_data = df[df["Sales"] >= sales_slider.value]
- updated_monthly_sales = filtered_data.groupby("Month")["Sales"].sum().reset_index()
- monthly_sales_source.data = updated_monthly_sales
- updated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()
- region_source.data = updated_region_sales
- sales_slider.on_change("value", update_data)
复制代码 2. 下拉菜单:按类别过滤
- from bokeh.models import Select
- # 创建下拉菜单
- category_select = Select(
- title="Select Category",
- value="All",
- options=["All"] + list(df["Category"].unique())
- )
- # 下拉菜单回调函数
- def filter_category(attr, old, new):
- filtered_data = df[df["Category"] == category_select.value] if category_select.value != "All" else df
- updated_monthly_sales = filtered_data.groupby("Month")["Sales"].sum().reset_index()
- monthly_sales_source.data = updated_monthly_sales
- updated_region_sales = filtered_data.groupby("Region")["Sales"].sum().reset_index()
- region_source.data = updated_region_sales
- category_select.on_change("value", filter_category)
复制代码 构建仪表盘结构
使用 Bokeh 的 layout 结构工具,将图表和控件组合在一起:
- from bokeh.layouts import column, row
- from bokeh.io import curdoc
- # 布局
- dashboard = column(
- row(category_select, sales_slider),
- trend_plot,
- row(category_pie_plot, region_bar_plot)
- )
- # 添加到文档
- curdoc().add_root(dashboard)
- curdoc().title = "Sales Dashboard"
复制代码 启动 Bokeh 服务
将上述代码生存为 dashboard.py 文件,然后在终端运行以下命令:
- bokeh serve --show dashboard.py
复制代码 浏览器将自动打开,您可以通过滑块和下拉菜单动态过滤数据,并实时检察图表的更新。
总结
通过本次实战,我们完成了一个交互式仪表盘的开辟,展示了 Bokeh 的以下强盛功能:
- 快速创建各种图表(折线图、饼图、柱状图)。
- 使用控件(滑块、下拉菜单)动态过滤数据。
- 构建多视图仪表盘并实时更新。
下一步,您可以尝试:
- 将仪表盘部署到云端,让更多用户访问。
- 添加更多控件和图表,丰富数据分析维度。
- 与 Flask 或 Django 集成,构建完整的数据应用。
赶快用 Bokeh 动手构建属于自己的交互式数据可视化项目吧!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |