2016-12-22 6 views
0

この単純な棒グラフhttp://codepen.io/ksh/pen/BQEGRKを見て、赤い点線の領域をドラッグして上または下にスライドさせると、ブラシの動きが元に戻ります。正しくするために何をすべきですか? 私が持っている2番目の質問は、どのように私の破線の領域を常に見えるようにし、同じ要素を再びドラッグすることができるかです。デフォルトでは、バーの高さがゼロのときに消滅し、バーをより高いスケールの位置にスライドすることはできません。d3js棒グラフ逆さまと滑りブラシ

var margin = {top: 20, right: 20, bottom: 50, left: 70}, 
    width = 400 - margin.left - margin.right, 
    height = 400 - margin.top - margin.bottom, 
    delim = 4; 

var scale = d3.scaleLinear() 
    .domain([0, 21]) 
    .rangeRound([height, 0]); 

var x = d3.scaleLinear() 
    .domain([0, barData.length]) 
    .rangeRound([0, width]); 

var y = d3.scaleLinear() 
    .domain([0, 21]) 
    .rangeRound([height, 0]); 

var svg = d3.select('#chart') 
    .append("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
    .append('g') 
     .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

svg.append("g") 
    .attr("transform", "translate(0," + height + ")") 
    .call(d3.axisBottom(x)); 

svg.append("g") 
    .call(d3.axisLeft(y)); 

function draw() { 
    x.domain([0, barData.length]); 

var brush = d3.brushY() 
    .extent(function (d, i) { 
     return [[x(i)+ delim/2, 0], 
       [x(i) + x(1) - delim/2, height]];}) 
    .on("brush", brushmove); 

var svgbrush = svg.selectAll('.brush').data(barData); 

svgbrush.enter() 
    .append('g') 
     .attr('class', 'brush') 
    .merge(svgbrush) 
    .append('g') 
     .call(brush) 
     .call(brush.move, function (d){return [d.value, 0].map(scale);}); 

svgbrush.exit().remove(); 

svgbrush 
    .append('text') 
     .attr('y', function (d){return scale(d.value) + 25;}) 
     .attr('x', function (d, i){return x(i) + x(0.5);}) 
     .attr('dx', '-.60em') 
     .attr('dy', -5) 
     .style('fill', 'white') 
     .text(function (d) {return d3.format('.2')(d.value);}) 

function brushmove() { 

    var d0 = d3.event.selection.map(scale.invert); 
    var d = d3.select(this).select('.selection');; 
    var d1 =[d0[0], 0]; 

    if (!d3.event.sourceEvent) return; 
    if (!d3.event.selection) return; 
    if (d3.event.sourceEvent.type === "brush") return; 

    d.datum().value = d0[0]; 
    d3.select(this).call(d3.event.target.move, d1.map(scale)); 

    svgbrush 
     .selectAll('text') 
      .attr('y', function (d){return scale(d.value) + 25;}) 
      .text(function (d) {return d3.format('.2')(d.value);}); 
} 
draw(); 

function upadateChartData() { 
    var newBarsToAdd = document.getElementById('charBarsCount').value; 
    var newBarData = function() { 
     return { index: _.uniqueId(), value: _.random(1, 20) } 
    }; 

    newBarData = _.times(newBarsToAdd, newBarData); 
    barData = _.concat(barData, newBarData) 

    draw(); 
}; 

答えて

0

あなたが逆さまにそれを回すためにSVGを変換するのであなたは奇妙なブラシの挙動を得ている:

transform: rotate(180deg); 

あなたが本当にあなたのチャートとラベルが逆さまになりたいですか?いずれにしても、変換を削除し、変換されていない領域で作業し、必要な場所で軸と棒を移動する方が簡単になると思います。

選択を[0] < = selection [1]にして、反転を呼び出すときに例外が発生しないようにする必要があります。選択が空の場合、[0,0] d3は自動的に選択とハンドルを非表示にします。それはハンドルの位置を選択から外すので、私はあなたがそれを目に見えるように自分で描く必要があると思います。ブラシモーブのようなもの:

if (!d3.event.selection) { 
     var index = parseInt(d.datum().index) - 1; 
     d3.select(this).selectAll('.handle') 
     .style("display","inline") 
     .attr("x", x(index)) 
     .attr("y", scale(0)) 
     .attr("width", x(index+1) - x(index)) 
     .attr("height", delim); 
     return; 
} 

また、選択が空にならないようにすることもできます。

+0

私は回転機能が必要です。この簡単な例では、最も簡単な方法で回転を追加しました。私はラベルについて気にしない、全体の図表は回転される。 おかげさまで私は選択値を確認する方法を見つけました。 v3の 'd3.event.selection'は' d3.brushSelection(node) 'です。 私は両方の値を比較していますが、それらが同じであれば元の '.handle'要素は' display:none'とそれ以外位置、サイズを定義する属性は削除されます。私はそれを防止したい。 – ksh

+0

'let eventSelection = d3.brushSelection(this); if((Math.round(eventSelection [0] * 10)/ 10)!==(Math.round(eventSelection [1] * 10)){d3.select(this).selectAll( '。handle ') .style(' display '、' inline ') .attr(' x '、' ... ') 定義しているすべての属性が適用されず、 。 私の目標は、[ここ](http://bl.ocks.org/mbostock/6498000)としてbahaviourを持っていますが、不幸にも、d3 v3を使って書かれており、d3 v4 – ksh

関連する問題