如何在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
相关产品推荐
相关产品推荐

