还在为生成静态图表无法交互而苦恼?
Bokeh正是为此而生的利器!
它是一个用于创建交互式、可缩放、可发布数据可视化的Python库,专为现代Web浏览器设计,能让你轻松制作出美观又功能丰富的交互式图表和数据应用。
🎨 你的第一个交互式图表
Bokeh通过pip安装。
我们从最简单的散点图开始,体验如何用几行代码创建一个带有工具栏的交互式图表。
from bokeh.plotting import figure, output_file, show
from bokeh.sampledata.iris import flowers
source = flowers
output_file(“my_first_bokeh_plot.html”)
p = figure(title=“鸢尾花数据集散点图”, toolbar_location=“above”)
p.circle(‘petal_length’, ‘petal_width’, source=source, color=‘species’, legend_field=‘species’)
show(p)
运行结果: (生成my_first_bokeh_plot.html,在浏览器中打开可交互操作)
🔗 理解ColumnDataSource与悬停提示
Bokeh的强大在于其ColumnDataSource对象。通过它,可以轻松实现悬停提示。
from bokeh.models import ColumnDataSource, HoverTool
data = {‘x’: [1, 2, 3, 4, 5], ‘y’: [6, 7, 2, 4, 5], ‘desc’: [‘A点’, ‘B点’, ‘C点’, ‘D点’, ‘E点’]}
source = ColumnDataSource(data=data)
p = figure(tools=“pan,wheel_zoom,box_zoom,reset,save”)
p.circle(‘x’, ‘y’, size=20, source=source)
hover = HoverTool(tooltips=[(“描述”, “@desc”), (“(x,y)”, “(@x, @y)”)])
p.add_tools(hover)
show(p)
运行结果: (生成带有悬停提示的交互式散点图)
📊 多图布局与主题样式
Bokeh支持将多个图表组合成复杂的仪表盘布局,并可通过主题改变外观风格。
from bokeh.layouts import row
p1 = figure(width=300, height=300)
p1.circle([1, 2, 3], [4, 5, 6], size=20, color=“navy”)
p2 = figure(width=300, height=300)
p2.line([1, 2, 3, 4], [4, 5, 2, 7], line_width=3, color=“firebrick”)
layout = row(p1, p2)
show(layout)
运行结果: (生成水平排列两个子图的布局)
🌐 构建可嵌入的独立Web应用
Bokeh的bokeh.server模块允许创建真正的数据驱动型Web应用程序,可部署为独立的Web服务。
from bokeh.models import Slider
from bokeh.layouts import column
from bokeh.plotting import curdoc, figure
import numpy as np
x = np.linspace(0, 10, 200)
plot = figure(height=300)
line = plot.line(x, np.sin(x))
slider = Slider(start=0, end=10, value=1, step=0.1, title=“频率”)
defupdate(attr, old, new):
line.data_source.data[‘y’] = np.sin(x * new)
slider.on_change(‘value’, update)
layout = column(slider, plot)
# bokeh serve --show my_app.py
运行结果: 此代码可部署为Bokeh服务器应用。
⚖️ 优势对比与使用建议
与Matplotlib相比,Bokeh原生支持Web交互。
与Plotly相比,它提供更低层级的控制能力。
建议在需要创建用于网页发布的交互式图表或构建以可视化为中心的Web应用时使用。
💬 总结与互动
Bokeh将数据可视化从“图片”升级为“界面”,增强了数据叙事的吸引力。
你更倾向于静态报告还是交互式仪表盘? 欢迎在评论区分享!