gpt4 book ai didi

javascript - 谁能帮我向 d3 力图添加文本?

转载 作者:行者123 更新时间:2023-11-28 04:17:15 26 4
gpt4 key购买 nike

我正在制作 d3 力图,我喜欢在每个节点上发布一些文本。我在互联网上搜索,只找到了 SVG 解决方案,但在我的代码中,我不使用 SVG,但我发现你可以使用 d3 事件,例如鼠标悬停,但我不明白如何将其放入我的代码中。

有了这个代码结构,任何人都可以帮助我解决我的问题吗?

<body>
<h1>Graph</h1>
<canvas id="network" width="1000" height="1000"></canvas>

<script src="https://d3js.org/d3.v4.min.js"></script>

<script>
/* global d3 */
var canvas = d3.select("#network"),
width = canvas.attr("width"),
height = canvas.attr("height"),
ctx = canvas.node().getContext("2d"),
r = 10,
x = d3.scaleOrdinal().range([20,width -20]),
color = d3.scaleOrdinal(d3.schemeCategory20),
simulation = d3.forceSimulation()
.force("x", d3.forceX(width/2))
.force("y", d3.forceY(height/2))
.force("collide", d3.forceCollide(r+1))
.force("charge", d3.forceManyBody()
.strength(-200))
.force("link", d3.forceLink()
.id(function (d) { return d.champion; }));

d3.json("docs/Champions.json", function (err, graph) {
if (err) throw err;

simulation.nodes(graph.nodes);
simulation.force("link")
.links(graph.links);
simulation.on("tick", update);

canvas
.call(d3.drag()
.container(canvas.node())
.subject(dragsubject)
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));

function update() {
ctx.clearRect(0, 0, width, height);

ctx.beginPath();
ctx.globalAlpha = 0.5;
ctx.strokeStyle = "#808080";
graph.links.forEach(drawLink);
ctx.stroke();


ctx.globalAlpha = 1.0;
graph.nodes.forEach(drawNode);
}

function dragsubject() {
return simulation.find(d3.event.x, d3.event.y);
}

});

function dragstarted() {
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
d3.event.subject.fx = d3.event.subject.x;
d3.event.subject.fy = d3.event.subject.y;
console.log(d3.event.subject.champion);
}

function dragged() {
d3.event.subject.fx = d3.event.x;
d3.event.subject.fy = d3.event.y;
}

function dragended() {
if (!d3.event.active) simulation.alphaTarget(0);
d3.event.subject.fx = null;
d3.event.subject.fy = null;
}

function drawNode(d) {
ctx.beginPath();
ctx.fillStyle = color(d.region);
ctx.moveTo(d.x, d.y);
ctx.arc(d.x, d.y, r, 0, Math.PI*2);
ctx.fill();
}

function drawLink(l) {
ctx.moveTo(l.source.x, l.source.y);
ctx.lineTo(l.target.x, l.target.y);
}

</script>

</body>
</html>

我使用的 JSON 文件就像

{ "nodes": [
{"champion":"name",
"region":"place"},
{...}
],
"links": [
{"source": "...",
"target":"..."},
{...}
]}

最佳答案

自从提出这个问题以来已经有一段时间了,但由于我也想知道如何实现原始问题中所提出的要求,因此这里是记录的解决方案:

为了添加来自例如的文本在 JSON 文件的“champion”字段中,添加以下行:

ctx.fillText(d.champion, d.x, d.y);

到函数:

function drawNode(d)

例如:

function drawNode(d) {
ctx.beginPath();
ctx.fillStyle = color(d.region);
ctx.moveTo(d.x, d.y);
ctx.arc(d.x, d.y, r, 0, Math.PI*2);
ctx.fill();
ctx.fillText(d.champion, d.x, d.y);
}

关于javascript - 谁能帮我向 d3 力图添加文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45723717/

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