我有一个表示使用d3和svg的网格。我正在尝试选择网格上任何特定图块的相邻(相邻)图块。通过网格上的x和y坐标访问切片。 我感觉相当混乱,并没有按照我想要的去做,我不希望被点击的瓷砖被选中,或者瓷砖对角。根据多个属性选择数据d3
var w = 960,
h = 500,
z = 20,
x = w/z,
y = h/z;
var svg = d3.select("body").append("svg")
.attr("width", w)
.attr("height", h);
svg.selectAll("rect")
.data(d3.range(x * y))
.enter().append("rect")
.attr("width", z)
.attr("height", z)
.attr("clicked", false)
.attr('x', horizontalpos)
.attr('y', verticalpos)
.on("click", test)
.style("stroke", "rgb(6,120,155)")
.style("stroke-width", 2)
.style("fill", "rgb(255, 255, 255)")
function translate(d) {
return "translate(" + (d % x) * z + "," + Math.floor(d/x) * z + ")";
}
function verticalpos(d) {
return ((d % x) * z);
}
function horizontalpos(d) {
return (Math.floor(d/x) * z);
}
function test(){
var d = d3.selectAll("[x='40']").filter("[y='40']");
d3.selectAll("[x=" + "'"+ (parseInt(d.attr("x")) +20).toString() +"'" +"],[x=" + "'"+ (parseInt(d.attr("x")) -20).toString() +"'" +"],"+ "[x=" + "'"+ (parseInt(d.attr("x"))).toString() +"'" +"]")
.filter("[y=" + "'"+ (parseInt(d.attr("y"))).toString() +"'" +"],[y=" + "'"+ (parseInt(d.attr("y")) +20).toString() +"'" +"]"+",[y=" + "'"+ (parseInt(d.attr("y")) -20).toString() +"'" +"]")
.transition()
.style("fill", "black");
}
的jsfiddle - https://jsfiddle.net/wkencq2w/15/
什么我不知道是 - 通过两个属性有没有一种方法来选择数据,就像这样:
d3.select("[x='40'], [y='40']")
这并没有为我工作,但其背后的逻辑是我想如何选择数据。
谢谢!我一直在玩弄这个,并寻找年龄选项。新的JavaScript和D3,所以我感谢帮助。 – user3636636
@ user3636636这两个问题,以及这个答案都混淆了网格的方向。根据'x'和'y'方块应该形成一个水平对齐的矩形,以完全填充视口。然而,现在绘制它时,它将它直立放置在SVG的底部,从而给它一个方形轮廓。尽管通过交换'verticalpos()'和'horizontalpos()'中的公式可以很容易地解决这个问题,但您可能需要查看一下我的[answer](/ a/34611132/4235784),它通过更多地依赖数据来避免此问题绑定和D3的内部工作。 – altocumulus