2017-06-23 132 views
1

我使用this主題來生成我的自定義時間間隔dc.lineChart。 隨着間隔5分鐘,它看起來像下一張圖片:變焦後更改時間間隔

enter image description here

放大後,我需要改變的時間間隔更小。據我所知,我需要以新的時間間隔重新組合,但我該怎麼做?

+1

我相信你看了[我之前發送的例子](http://dc-js.github.io/dc.js/examples/switching-time-intervals.html)。你有沒有嘗試整合它?接下來發生了什麼? – Gordon

+0

是的,但可能沒有完全理解。如果我使用'.rangeChart',我應該從哪裏調用你的'setup()'函數?添加到'onFiltered'偵聽器? –

+0

我會和['zoomed'事件](http://dc-js.github.io/dc.js/docs/html/dc.baseMixin.html#on__anchor)上的監聽器一起去。如果在dc.js中包含一個例子,這將是太棒了。如果你想貢獻,也許你可以開始一個小提琴[通過分叉這個](http://jsfiddle.net/gordonwoodhull/u57bfje8/),從'zoomed'監聽器和另一個例子中的代碼開始,看看什麼打破並更新您的問題? – Gordon

回答

1

對於當前主題,我使用了this示例,並向on.('zoomed')圖表偵聽器添加了一些邏輯。我在JSFiddle上爲其他人寫了一些例子。

// read data 
let experiments = d3.csv.parse(someCsvData); 

//create and bind charts 
let chart = dc.lineChart('#chart'), 
    scrollChart = dc.barChart('#scrollChart'); 

// parse date  
experiments.forEach(x => { 
    x.date = Date.parse(x.date); 
}); 

// create crossfilter, dimension and group 
let ndx = crossfilter(experiments), 
    dim = ndx.dimension(d => new Date(d.date)), 
    scrollGroup = dim.group(d3.time.month).reduceSum(d => +d.volume) 

// define function for selecting time ticks 
const getNormalizingTimeFunction = (dataSize) => { 
    switch (true) { 
     case dataSize < 100: 
      return d3.time.day; 
     case dataSize < 300: 
      return d3.time.week; 
     default: 
      return d3.time.month; 
    } 
} 

// create `start` and `end` time points 
let startDate = experiments[0].date; 
let endDate = experiments[experiments.length - 1].date; 

scrollChart 
    .width(768) 
    .height(50) 
    .x(d3.time.scale().domain([startDate, endDate])) 
    .margins({left: 50, top: 10, right: 10, bottom: 20}) 
    .clipPadding(10) 
    .dimension(dim) 
    .group(scrollGroup) 
    .alwaysUseRounding(true) 
    .elasticY(true) 
    .yAxis().ticks(0); 

chart 
.width(768) 
.height(480) 
.brushOn(false) 
.x(d3.time.scale().domain([startDate, endDate])) 
.margins({left: 50, top: 10, right: 10, bottom: 20}) 
.rangeChart(scrollChart) 
.dimension(dim) 
.group(scrollGroup) 
.renderArea(true) 
.on('zoomed', (chart) => { 
    let actions = dim.top(Infinity); 
    let normalizeTime = getNormalizingTimeFunction(actions.length); 
    let newGroup = dim.group(normalizeTime).reduceSum(d => +d.volume) 
    chart.group(newGroup); 
    chart.redraw(); 
}); 

chart.render(); 
scrollChart.render();