D3 は、共有属性を持つグループ内の複数の図形をどのように選択できますか?
各データポイントが多数の形状で表される D3 でグラフを作成しています。単純なデータ セットがあり、それにバインドされた 3 つの個別の図形セットを持つグループを作成します。
マウスオーバーおよびマウスアウトすると、行の形状の色が変わるようにします。"over" と "out" の 2 つの関数があり、マウスオーバーで呼び出すことができます。オブジェクトのスタイル プロパティは正常に変更されますが、形状のセットごとに順番に変更されます。
以下のコードとこのフィドルは、問題を示しています。
このアプローチは形状を超えてスケーリングされず、D3 の選択に関する重要なポイントが欠けているように感じます。共有インデックス (または他の属性) を持つすべてのオブジェクトを 1 ステップで選択できますか?
私はさまざまなアプローチを試しました:
- select("シェイプ").filter(...)
- select("シェイプ")[0][i]
しかし、これらを機能させることに成功していません。
var dataset = ["A", "B", "C"];
// Create SVG object
var svg = d3.select("body")
.append("svg")
.attr({width: 600, height: 400});
var shapes = svg.append("g");
// Circles
var circles = shapes.selectAll("circle")
.data(dataset)
.enter()
.append("circle")
.attr("id",function(d, i) {return i;})
.attr("cx",125)
.attr("cy",function(d, i) {return (i+1)*100-25;})
.attr("r",25)
.on("mouseover", over)
.on("mouseout", out)
.append("title").text(function(d, i) {return d + " " + i;});
// Ellipses
var ellipses = shapes.selectAll("ellipse")
.data(dataset)
.enter()
.append("ellipse")
.attr("cx", 350)
.attr("cy",function(d, i) {return (i+1)*100-25;})
.attr("rx",50)
.attr("ry",25)
.on("mouseover", over)
.on("mouseout", out)
.append("title").text(function(d, i) {return d + " " + i;});
// Squares
var squares = shapes.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x", 200)
.attr("y",function(d, i) {return (i+1)*100-50;})
.attr("height",50)
.attr("width",50)
.on("mouseover", over)
.on("mouseout", out)
.append("title").text(function(d, i) {return d + " " + i;});
// Over function to be called on mouseover
function over(d, i) {
shapes.selectAll("circle").filter(function(e, j) {return j == i;})
.style("fill", "green");
shapes.selectAll("rect").filter(function(e, j) {return j == i;})
.style("fill", "green");
shapes.selectAll("ellipse").filter(function(e, j) {return j == i;})
.style("fill", "green");
}
// Out function to be called on mouseout
function out(d, i) {
shapes.selectAll("rect").filter(function(e, j) {return j == i;})
.style("fill", null);
shapes.selectAll("circle").filter(function(e, j) {return j == i;})
.style("fill", null);
shapes.selectAll("ellipse").filter(function(e, j) {return j == i;})
.style("fill", null);
}