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