2017-02-22 4 views
1

Есть ли способ ограничить высоту чистки - скажем, 50% оси y (только от оси Y 0 - 250, чистка должна работать)? Example fiddleDC JS Предельная высота чистки

JS код:

var hitslineChart = dc.barChart("#chart-line-hitsperday"); 

      var data = [ 
     {date: "12/27/2012", http_404: 2, http_200: 190, http_302: 100}, 
     {date: "12/28/2012", http_404: 2, http_200: 10, http_302: 100}, 
     {date: "12/29/2012", http_404: 1, http_200: 300, http_302: 200}, 
     {date: "12/30/2012", http_404: 2, http_200: 90, http_302: 0}, 
     {date: "12/31/2012", http_404: 2, http_200: 90, http_302: 0}, 
     {date: "01/01/2013", http_404: 2, http_200: 90, http_302: 0}, 
     {date: "01/02/2013", http_404: 1, http_200: 10, http_302: 1}, 
     {date: "01/03/2013", http_404: 2, http_200: 90, http_302: 0}, 
     {date: "01/04/2013", http_404: 2, http_200: 90, http_302: 0}, 
     {date: "01/05/2013", http_404: 2, http_200: 90, http_302: 0}, 
     {date: "01/06/2013", http_404: 2, http_200: 200, http_302: 1}, 
     {date: "01/07/2013", http_404: 1, http_200: 200, http_302: 100} 
     ]; 

      var ndx = crossfilter(data); 
      var parseDate = d3.time.format("%m/%d/%Y").parse; 
      data.forEach(function(d) { 
     d.date = Date.parse(d.date); 
     d.total= d.http_404+d.http_200+d.http_302; 
     }); 
      var dateDim = ndx.dimension(function(d) {return d.date;}); 
      var hits = dateDim.group().reduceSum(function(d) {return d.total;}); 
      var minDate = dateDim.bottom(1)[0].date; 
      var maxDate = dateDim.top(1)[0].date; 

     hitslineChart.width(500) 
        .height(200) 
        .dimension(dateDim) 
        .group(hits) 
        .x(d3.time.scale().domain([minDate,maxDate]));           
      dc.renderAll(); 

Спасибо, Arun

ответ

0

Хотя ваш пример использует dc.js 1.7.0, я буду отвечать за dc.js 2.0, так как он много новее и несколько интерфейсов API.

Метод состоит в том, чтобы переопределить функции от coordinateGridMixin, которые определяют размер кисти. Это становится немного волосатым, но это возможно.

Оказалось, что нам придется переопределить три недокументированные функции, которые отображают кисть, renderBrush, setBrushY и (к сожалению) resizeHandlePath.

Причина, по которой эта волосатость заключается в том, что мы действительно хотим переопределить brushHeight, но эта функция является частной.

Мы определим наши собственные, как это:

function height_over_2() { 
    return (hitslineChart._xAxisY() - hitslineChart.margins().top)/2; 
} 

Для renderBrush, нам нужно сместить щетку вниз height_over_2(). Мы будем проходить через вызов, а затем изменить преобразование:

dc.override(hitslineChart, 'renderBrush', function(g) { 
    hitslineChart._renderBrush(g); 
    var gBrush = hitslineChart.select('g.brush') 
     .attr('transform', 'translate(' + hitslineChart.margins().left + ',' + (hitslineChart.margins().top + height_over_2()) + ')') 
}); 

setBrushY мы заменим полностью (мы могли бы просто присвоить ей, но мы будем использовать dc.override для консистенции):

dc.override(hitslineChart, 'setBrushY', function(gBrush) { 
    gBrush.selectAll('rect') 
     .attr('height', height_over_2()); 
    gBrush.selectAll('.resize path') 
     .attr('d', hitslineChart.resizeHandlePath); 
}); 

Наконец, resizeHandlePath также использует высоту, и здесь мы (тьфу) должны скопировать большой кусок кода из dc.js, который сам по себе был скопирован с crossfilter демо:

dc.override(hitslineChart, 'resizeHandlePath', function (d) { 
    var e = +(d === 'e'), x = e ? 1 : -1, y = height_over_2()/3; 
    return 'M' + (0.5 * x) + ',' + y + 
     'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6) + 
     'V' + (2 * y - 6) + 
     'A6,6 0 0 ' + e + ' ' + (0.5 * x) + ',' + (2 * y) + 
     'Z' + 
     'M' + (2.5 * x) + ',' + (y + 8) + 
     'V' + (2 * y - 8) + 
     'M' + (4.5 * x) + ',' + (y + 8) + 
     'V' + (2 * y - 8); 
}); 

short brush

вилка вашей скрипки: http://jsfiddle.net/gordonwoodhull/anz9gfy0/13/

+0

Я бы рассмотреть возможность сделать 'brushHeight' переписываемым в dc.js, но, честно говоря, этот запрос никогда не придумать раньше. – Gordon

+0

Спасибо, Гордон! Пожалуйста, подумайте над добавлением функции brushHeight, переопределяемой в dc.js, поскольку подсказки для инструментов точки данных не появляются, когда мы наводим на диаграммы, что очень полезно. – user3559365

+0

О, это прецедент? Я должен был спросить. Недавно я ответил, что здесь: http://stackoverflow.com/a/42278559/676195 IMO интерфейс немного запутан с подсказками инструментов, перехватывающих кисть, но там вы идете. – Gordon

Смежные вопросы