You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bokeh中动态更新DatetimeTickFormatter?

问题描述

我有一个带有不同选项的Select()组件,图表的x_axis_type为"datetime"。根据Select()的选项,会展示不同时间范围的数据。我希望在切换Select()选项时修改DatetimeTickFormatter。

目前在jv_on_change()中尝试了以下代码:

for (let i = 0; i < formatters.length; i++) {
    formatters[i].minutes = new_format.minutes;
    formatters[i].hours = new_format.hours;
    formatters[i].days = new_format.days;
}

其中formatters参数传入为:

args={"formatters": [plot.xaxis[0].formatter for plot in plots]}

通过console.log(formatters[i])可以看到对象已更新,但图表上没有显示变化。请问如何实现动态更新(是否可行)?

解决方案

可行,但直接修改DatetimeTickFormatter的属性后,需要手动触发Bokeh的视图更新——Bokeh不会自动监测对象属性的变更,必须显式通知框架重绘。

方法1:修改属性后触发变更事件

在更新完formatter的属性后,调用change.emit()方法,通知Bokeh属性已修改,触发图表重绘:

for (let i = 0; i < formatters.length; i++) {
    formatters[i].minutes = new_format.minutes;
    formatters[i].hours = new_format.hours;
    formatters[i].days = new_format.days;
    // 触发formatter的变更事件,让Bokeh更新视图
    formatters[i].change.emit();
}

方法2:直接替换formatter对象

也可以直接创建新的DatetimeTickFormatter实例替换原对象,再触发轴的变更事件:

for (let i = 0; i < plots.length; i++) {
    // 假设new_format是配置好的格式对象
    plots[i].xaxis[0].formatter = new Bokeh.DatetimeTickFormatter(new_format);
    // 触发轴的变更事件
    plots[i].xaxis[0].change.emit();
}

注意这种方式需要确保plots作为参数传入到jv_on_change()的args中。

核心逻辑是Bokeh的JavaScript对象采用显式变更通知机制,只有调用change.emit()后,框架才会重新渲染对应的组件,更新图表显示。

内容的提问来源于stack exchange,提问作者BlackFog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 18:04:52