平移时如何让散景动态调整 y_range
How to get bokeh to dynamically adjust y_range when panning
我有一个很长的时间序列,其 Y 范围随时间变化。同时将 X 范围/视口限制在更小的时间段内,以便可以看到细节。由于数据是水平平移的,bokeh 不会根据视口中的可见数据调整 Y 范围。
这是 rbokeh 中的示例(如果有用,可以提供 python 中的等效项):
require(rbokeh)
x <- seq(as.Date('2010-1-1'), as.Date('2017-1-1'), by='days')
len <- NROW(x)
y <- (1:len) * 5e-2 + rnorm(len, sd=10)
range <- c(x[1], x[200])
figure(width=800,height=300, xlim=range) %>%
ly_lines (x, y) %>%
tool_pan(dimensions='width')
由此产生的视觉效果显示了 -25 到 150 的 y 范围,表达了整个系列的范围,但由于可见数据的范围较小,减少了视口中可见的细节:
我希望看到初始范围显示 -25 到 30,与可见点一致(如下所示),然后在水平平移数据时更改 Y 范围。
问题
有没有办法在散景中打开自动缩放/范围调整行为,以便在客户端完成。是否有小部件选项或 js 注入可以使这项工作正常进行?
Bokeh 的 python 和 R 实现都使用了核心 coffee/JS 库,所以怀疑这个问题与两者都相关。
根据 bokeh 社区的一些指示,确定了解决方案。我希望将来可以将其添加为一个选项,以避免编写(有点脆弱的)JS 代码。
解决方法如下:
yrange.callback <- function (var, margin=0.15)
{
code <- sprintf ("
var plot = cb_obj.plots[0];
var data = %s_data.get('data');
var x = data['x'];
var y = data['y'];
var Xstart = plot.x_range.start;
var Xend = plot.x_range.end;
function sGE (e) { return e >= Xstart; }
function eGE (e) { return e >= Xend; }
function fixstart (i) { return i >= 0 ? i : x.length - 20; }
function fixend (i) { return i > 0 ? i : x.length - 1; }
var Istart = fixstart(x.findIndex(sGE))
var Iend = fixend(x.findIndex(eGE))
var yview = y.slice(Istart, Iend+1);
var ymin = Math.min(...yview);
var ymax = Math.max(...yview);
var dy = ymax - ymin;
var margin = %f * dy;
cb_obj.start = ymin - margin;
cb_obj.end = ymax + margin;", var, margin)
custom_callback(code, lnames=var)
}
x <- seq(as.Date('2010-1-1'), as.Date('2017-1-1'), by='days')
len <- NROW(x)
y <- (1:len) * 5e-2 + rnorm(len, sd=10)
## render
range <- c(x[1], x[200])
figure(width=800,height=300, xlim=range) %>%
ly_lines (x, y, lname = "points", lgroup='g1') %>%
y_range(callback = yrange.callback('points'))
我必须将其附加到 r_range
回调而不是 x_range
回调,因为 x_range 回调中的 cb_obj
将是 x_range 对象,因此将事件回调放在 y_range
上提供了用于修改的 y 范围对象。我无法确定修改绘图对象上的 y_range 的方法,例如更新。
我有一个很长的时间序列,其 Y 范围随时间变化。同时将 X 范围/视口限制在更小的时间段内,以便可以看到细节。由于数据是水平平移的,bokeh 不会根据视口中的可见数据调整 Y 范围。
这是 rbokeh 中的示例(如果有用,可以提供 python 中的等效项):
require(rbokeh)
x <- seq(as.Date('2010-1-1'), as.Date('2017-1-1'), by='days')
len <- NROW(x)
y <- (1:len) * 5e-2 + rnorm(len, sd=10)
range <- c(x[1], x[200])
figure(width=800,height=300, xlim=range) %>%
ly_lines (x, y) %>%
tool_pan(dimensions='width')
由此产生的视觉效果显示了 -25 到 150 的 y 范围,表达了整个系列的范围,但由于可见数据的范围较小,减少了视口中可见的细节:
我希望看到初始范围显示 -25 到 30,与可见点一致(如下所示),然后在水平平移数据时更改 Y 范围。
问题
有没有办法在散景中打开自动缩放/范围调整行为,以便在客户端完成。是否有小部件选项或 js 注入可以使这项工作正常进行?
Bokeh 的 python 和 R 实现都使用了核心 coffee/JS 库,所以怀疑这个问题与两者都相关。
根据 bokeh 社区的一些指示,确定了解决方案。我希望将来可以将其添加为一个选项,以避免编写(有点脆弱的)JS 代码。
解决方法如下:
yrange.callback <- function (var, margin=0.15)
{
code <- sprintf ("
var plot = cb_obj.plots[0];
var data = %s_data.get('data');
var x = data['x'];
var y = data['y'];
var Xstart = plot.x_range.start;
var Xend = plot.x_range.end;
function sGE (e) { return e >= Xstart; }
function eGE (e) { return e >= Xend; }
function fixstart (i) { return i >= 0 ? i : x.length - 20; }
function fixend (i) { return i > 0 ? i : x.length - 1; }
var Istart = fixstart(x.findIndex(sGE))
var Iend = fixend(x.findIndex(eGE))
var yview = y.slice(Istart, Iend+1);
var ymin = Math.min(...yview);
var ymax = Math.max(...yview);
var dy = ymax - ymin;
var margin = %f * dy;
cb_obj.start = ymin - margin;
cb_obj.end = ymax + margin;", var, margin)
custom_callback(code, lnames=var)
}
x <- seq(as.Date('2010-1-1'), as.Date('2017-1-1'), by='days')
len <- NROW(x)
y <- (1:len) * 5e-2 + rnorm(len, sd=10)
## render
range <- c(x[1], x[200])
figure(width=800,height=300, xlim=range) %>%
ly_lines (x, y, lname = "points", lgroup='g1') %>%
y_range(callback = yrange.callback('points'))
我必须将其附加到 r_range
回调而不是 x_range
回调,因为 x_range 回调中的 cb_obj
将是 x_range 对象,因此将事件回调放在 y_range
上提供了用于修改的 y 范围对象。我无法确定修改绘图对象上的 y_range 的方法,例如更新。