Bokeh项目中的等高线图绘制指南
概述
等高线图是一种在二维四边形网格上计算并绘制等值线的可视化技术。Bokeh作为一款强大的Python交互式可视化库,从3.0版本开始提供了完整的等高线图绘制功能。本文将详细介绍如何使用Bokeh创建静态和动态的等高线图,包括基础用法和高级技巧。
基础等高线图
简单示例
让我们从一个最基本的等高线图开始:
from bokeh.plotting import figure, show
import numpy as np
# 创建数据网格
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
# 定义等高线层级
levels = np.linspace(-1, 1, 11)
# 创建图形
p = figure(width=600, height=500, title="基础等高线图示例")
# 绘制等高线
contour = p.contour(X, Y, Z, levels,
line_color="black",
fill_color=["#%02x%02x%02x" % (int(r), int(g), int(b))
for r, g, b, _ in 255*mpl.cm.viridis(np.linspace(0, 1, len(levels)-1))])
# 添加颜色条
p.add_layout(contour.construct_color_bar(), "right")
show(p)
在这个例子中,我们需要注意几个关键点:
z
参数是定义在x、y网格上的二维数组levels
参数定义了要绘制的等高线层级序列line_color
控制等高线颜色,可以是单一值或向量fill_color
控制填充区域颜色,长度应为len(levels)-1
极坐标等高线图
Bokeh同样支持在极坐标网格上绘制等高线:
# 极坐标示例
theta = np.linspace(0, 2*np.pi, 100)
r = np.linspace(0.1, 1, 50)
T, R = np.meshgrid(theta, r)
Z = np.sin(R*10 + T*5)
levels = np.linspace(-1, 1, 21)
p = figure(width=600, height=500, title="极坐标等高线图")
contour = p.contour(T, R, Z, levels,
line_color=["red" if level > 0 else "blue" for level in levels],
fill_color=["#ff000055" if level > 0 else "#0000ff55" for level in levels[:-1]],
hatch_pattern=["/" if level > 0 else "\\" for level in levels[:-1]])
p.add_layout(contour.construct_color_bar(title="值"), "right")
show(p)
这个示例展示了更丰富的视觉属性设置:
- 使用向量属性区分正负等高线
- 添加了填充图案(hatch)增强可视化效果
- 颜色条添加了标题
动态等高线图
Bokeh支持通过服务器应用创建动态更新的等高线图:
from bokeh.plotting import curdoc
from bokeh.models import ColumnDataSource
import numpy as np
# 初始数据
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
levels = np.linspace(-1, 1, 11)
# 创建图形
p = figure(width=600, height=500)
contour = p.contour(X, Y, Z, levels, line_color="black", fill_color="Viridis256")
def update():
global Z
# 更新Z数据
Z = np.sin(X + 0.1*time.time()) * np.cos(Y)
# 生成新的等高线数据
new_data = contour.contour_data(X, Y, Z, levels)
# 更新渲染器
contour.set_data(new_data)
# 添加定时器
curdoc().add_periodic_callback(update, 100)
实现动态更新的关键步骤:
- 初始调用
contour()
并保存返回的渲染器 - 计算或获取更新后的Z数组
- 使用
contour_data()
生成新的等高线数据对象 - 调用渲染器的
set_data()
方法更新数据 - 设置定时器循环执行更新
高级技巧
网格处理
- 当x、y参数未指定时,Bokeh会使用间距为1的笛卡尔网格
- 要排除某些网格点,可以使用NumPy的masked数组或将对应Z值设为
np.nan
视觉属性设置
颜色属性(line_color
, fill_color
, hatch_color
)支持多种指定方式:
-
直接指定颜色序列
- 长度不符时会自动重采样
- 如
Cividis256
这类256色板很适合
-
使用调色板集合
- 如
Cividis
这类字典结构 - 自动选择最接近长度的调色板并插值
- 如
性能优化
- 等高线计算由ContourPy库完成,对于大型网格可能需要优化
- 静态图可考虑预计算并保存结果
- 动态图可适当降低更新频率
总结
Bokeh的等高线图功能提供了从基础到高级的完整解决方案,能够满足科研、工程和数据分析中的各种可视化需求。通过合理设置视觉属性和利用动态更新机制,可以创建出既美观又实用的等高线可视化效果。
随着Bokeh版本的更新,等高线图功能还将继续增强,建议关注官方文档获取最新特性信息。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考