2017-04-25 61 views
0

我有一個很長的時間序列,隨時間變化的Y範圍。同時將X範圍/視口限制在一個較小的時間段內,以便可以看到細節。當數據水平移動時,散景不會根據視口中的可見數據調整Y範圍。如何讓散景在平移時動態調整y_range

這裏是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範圍,表達整個系列的程度,但減少了詳細的視口中可見由於較小的範圍的可見光的數據: what I get now

我想看到的初始範圍,以顯示-25〜30,在與可見點線(如下所示)並在數據水平移動時隨後更改Y範圍。 what I would like to see

問題

有沒有辦法打開自動縮放/範圍調整背景虛化的行爲,以便在客戶端完成。有沒有一個小工具選項或JS注入,將使這項工作?

Bokeh的python和R實現都使用核心咖啡/ JS庫,因此懷疑這個問題與兩者都有關。

回答

0

隨着散景社區的一些指示,確定了一個解決方案。我希望將來可以添加這個選項,以避免編寫(稍微脆弱)的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回調的cb_obj上x_range回調將是x_range對象,從而把事件回調在y_range提供了y範圍對象進行修改。我無法確定如何更新繪圖對象上的y_range。

相關問題