これは実現できますが、D3 ブラシ API を使用する必要があります(以下の注を参照)。
これはhttp://bl.ocks.org/4747894の例です。
brush
要素は円の後ろにあります
- サークルはイベントに応答し
mousedown
ます。(他のイベントにも対応できます。)
- ドラッグがいずれかの円の内側から開始された場合でも、
brush
要素は適切に動作します。
D3 ソース コードをトレースして確認すると、ブラシの上の要素からイベントが発生しextent
たときに が正しくリセットされていないことがわかります。これは、要素のリスナーでブラシの をリセットすることで修正できます。mousemove
circle
extent
mousedown
circle
circles.on("mousedown", function (d, i) {
// _svg_ is the node on which the brush has been created
// x is the x-scale, y is the y-scale
var xy = d3.mouse(svg.node()),
xInv = x.invert(xy[0]),
yInv = y.invert(xy[1]);
// Reset brush's extent
brush.extent([[xInv, yInv], [xInv, yInv]]);
// Do other stuff which we wanted to do in this listener
});
注: API に従って、ブラシの選択は の呼び出し時に自動的に更新されません.extent(values)
。円をクリックするだけで はリセットされますextent
が、選択した内容は再描画されません。の内部で別の選択が開始されたcircle
場合、または円の外側と現在の選択をクリックして選択が破棄されます。質問からわかるように、これは望ましい動作です。extent
ただし、これにより、ブラシの内容がグラフに表示される選択になるという前提で記述されたコードが壊れる可能性があります。