【发布时间】:2018-02-15 11:28:43
【问题描述】:
我正在使用 d3 制作一个必须支持多达 100 个点的折线图,因此非常拥挤。问题是一些标签重叠。
我尝试的方法涉及绘制所有点,然后分别绘制所有标签并在标签上运行强制碰撞以阻止它们重叠,然后在强制碰撞后在每个标签及其关联点之间绘制一条线.
我不能让力量发挥作用,更不用说画线了。
我们也热烈欢迎任何有关更好方法的建议。
这是我的代码:
$.each(data.responseJSON.responsedata, function(k, v) {
var thispoint = svg.append("g").attr("transform", "translate("+pointx+","+pointy+")");
thispoint.append("circle").attr("r", 10).style("fill","darkBlue").style("stroke","black");
var label = svg.append("text").text(v.conceptName).style("text-anchor", "end").attr("font-family", "Calibri");
label.attr("transform", "translate("+(pointx)+","+(pointy-12)+") rotate(90)")
});
nodes = d3.selectAll("text")
simulation = d3.forceSimulation(nodes)
.force("x", d3.forceX().strength(10))
.force("y", d3.forceY().strength(10))
.force("collide",d3.forceCollide(20).strength(5))
.velocityDecay(0.15);
ticks = 0;
simulation.nodes(data)
.on("tick", d => {
ticks = ticks + 1;
d3.select(this).attr("x", function(d) { return d.x }).attr("y", function(d) { return d.x });
console.log("updated" + this)
});
【问题讨论】:
-
在
"tick"监听器中,如果您希望this成为DOM 元素,请不要使用箭头函数。将其更改为常规函数。
标签: javascript d3.js