gpt4 book ai didi

javascript - 如何在 D3.js 中不使用 .on() 来获取组元素内圆的位置?

转载 作者:行者123 更新时间:2023-12-02 15:35:50 26 4
gpt4 key购买 nike

我有一个散点图,其中 x 尺度是有序的,y 尺度是线性的。共享 x 值的圆圈将放置在它们自己的组中。

我使用 rangeBands() 作为 x 尺度,因为我最终将为每个 x 值绘制一个箱线图。因此,我通过平移 g 元素将圆定位在 x 轴上。

我想使用画笔突出显示属于画笔范围的圆圈。我可以获取圆的 cx 和 cy 属性,但这些值是相对于父 g 元素的,因此它们不能用于检查范围。

给定一个circle元素,如何获取父g元素的位置?

这是一个JSFiddle到目前为止我的代码。

<!DOCTYPE html>
<meta charset="utf-8">
<head>
<style>

#plot {
border-style: solid;
border-width: 4px;
border-color: lightgrey;
display: inline-block;
}

.extent {
fill: grey;
fill-opacity: 0.5;
stroke: black;
stroke-width: 1px;
}

circle.highlight {
fill: yellow;
}

</style>
<script type="text/javascript" src="d3.js"></script>
</head>

<body>
<div id=plot>
<script>

(function() {
var data = [];

for (i = 0; i < 100; i++) {
var x = Math.random();
var y = Math.floor(Math.random() * 100) + 1;

if (x < 0.33) x = "red";
else if (x < 0.66) x = "green";
else x = "blue";

data.push({x: x, y: y});
}

data = d3.nest()
.key(function(d) { return d.x })
.entries(data);

var xScale = d3.scale.ordinal()
.domain(data.map(function(d) { return d.key }))
.rangeBands([0, 400], 0.5, 0.5);

var yScale = d3.scale.linear()
.domain([0, 100])
.range([400, 0]);

var svg = d3.select("#plot").append("svg")
.attr("width", 400)
.attr("height", 400)

var brush = d3.svg.brush()
.x(xScale)
.y(yScale)
.on("brushend", brushend);

svg.call(brush);

function brushend() {
var e = brush.extent();
}

svg.selectAll("scatter")
.data(data)
.enter().append("g")
.attr("transform", function(d) {
return "translate(" + xScale(d.key) + ", 0)";
})
.each(scatter);

function scatter(d) {
var g = d3.select(this);

g.selectAll("circle")
.data(d.values)
.enter().append("circle")
.attr("r", 4)
.attr("cx", function(d) { return xScale.rangeBand()/2 })
.attr("cy", function(d) { return yScale(d.y) })
.attr("fill", function(d) { return d.x });
}
})();

</script>
</div>
</body>
</html>

最佳答案

给定一个圆作为this:

var parent = d3.select(this.parentNode),
self = d3.select(this),
trans = d3.transform(parent.attr("transform")).translate,
x = +self.attr('cx') + trans[0],
y = +self.attr('cy') + trans[1];

x, y 是相对于 svg 的像素位置。

关于javascript - 如何在 D3.js 中不使用 .on() 来获取组元素内圆的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32952490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com