Bokeh项目中的等高线图绘制指南

Bokeh项目中的等高线图绘制指南

bokeh bokeh/bokeh: 是一个用于创建交互式图形和数据的 Python 库。适合用于数据可视化、数据分析和呈现,以及创建动态的 Web 应用。特点是提供了一种简洁、直观的 API 来描述和处理数据,并生成交互式的可视化效果。 bokeh 项目地址: https://gitcode.com/gh_mirrors/bo/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)

在这个例子中,我们需要注意几个关键点:

  1. z参数是定义在x、y网格上的二维数组
  2. levels参数定义了要绘制的等高线层级序列
  3. line_color控制等高线颜色,可以是单一值或向量
  4. 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)

实现动态更新的关键步骤:

  1. 初始调用contour()并保存返回的渲染器
  2. 计算或获取更新后的Z数组
  3. 使用contour_data()生成新的等高线数据对象
  4. 调用渲染器的set_data()方法更新数据
  5. 设置定时器循环执行更新

高级技巧

网格处理

  • 当x、y参数未指定时,Bokeh会使用间距为1的笛卡尔网格
  • 要排除某些网格点,可以使用NumPy的masked数组或将对应Z值设为np.nan

视觉属性设置

颜色属性(line_color, fill_color, hatch_color)支持多种指定方式:

  1. 直接指定颜色序列

    • 长度不符时会自动重采样
    • Cividis256这类256色板很适合
  2. 使用调色板集合

    • Cividis这类字典结构
    • 自动选择最接近长度的调色板并插值

性能优化

  • 等高线计算由ContourPy库完成,对于大型网格可能需要优化
  • 静态图可考虑预计算并保存结果
  • 动态图可适当降低更新频率

总结

Bokeh的等高线图功能提供了从基础到高级的完整解决方案,能够满足科研、工程和数据分析中的各种可视化需求。通过合理设置视觉属性和利用动态更新机制,可以创建出既美观又实用的等高线可视化效果。

随着Bokeh版本的更新,等高线图功能还将继续增强,建议关注官方文档获取最新特性信息。

bokeh bokeh/bokeh: 是一个用于创建交互式图形和数据的 Python 库。适合用于数据可视化、数据分析和呈现,以及创建动态的 Web 应用。特点是提供了一种简洁、直观的 API 来描述和处理数据,并生成交互式的可视化效果。 bokeh 项目地址: https://gitcode.com/gh_mirrors/bo/bokeh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计纬延

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值