gpt4 book ai didi

javascript - d3.js 力定向图 - 使用图像而不是圆圈作为节点

转载 作者:太空宇宙 更新时间:2023-11-04 16:18:23 25 4
gpt4 key购买 nike

我正在尝试使用 d3.js 可视化动态网络拓扑。到目前为止,我可以通过将圆圈作为节点来使其工作,但我必须为不同的节点类型放置不同的自定义图像。

我当前的代码是这样的:

 node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(jsonTry.nodes)
.enter().append("circle")
.attr("r", 10)
.attr("fill", function(d) { return color(d.group); })
.call(d3.drag()
.subject(dragsubject)
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));

首先,我想将图像放置到所有节点以查看其工作原理,如下所示:

node = svg.append("g")
.attr("class", "nodes")
.data(graph.nodes)

node.append("svg:image")
.attr("xlink:href", "https://github.com/favicon.ico")
.attr("x", -8)
.attr("y", -8)
.attr("width", 16)
.attr("height", 16);

它似乎不是这样工作的,因为我只能看到链接,而节点就消失了。我发现了一些使用 d3 v3 的示例,但目前我正在使用 d3 v4 并希望相应地实现它(因为我遇到了forceLink() 未包含在 v3 中的问题)

提前致谢。

最佳答案

如果您附加 <image>,您的方法就会起作用。到<g> 。但是,您要附加 <image><circle>元素,那是行不通的。

您有两种解决方案:

  1. 附加 image面向团体,而不是圈子;
  2. 保留你的圈子,但使用 def :

    var defs = svg.append('svg:defs');

    defs.append("svg:pattern")
    .attr("id", "myPattern")
    .attr("width", 1)
    .attr("height", 1)
    .append("svg:image")
    .attr("xlink:href", "https://github.com/favicon.ico")
    .attr("width", 16)
    .attr("height", 16)
    .attr("x", 0)
    .attr("y", 0);

这是一个演示:

var nodes = [{
"id": 1,
}, {
"id": 2,
}, {
"id": 3,
}, {
"id": 4,
}, {
"id": 5,
}, {
"id": 6,
}, {
"id": 7,
}, {
"id": 8,
}];

var links = [{
source: 1,
target: 2
}, {
source: 1,
target: 3
}, {
source: 1,
target: 4
}, {
source: 2,
target: 5
}, {
source: 2,
target: 6
}, {
source: 1,
target: 7
}, {
source: 7,
target: 8
}];

var index = 10;
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
node,
link;

var defs = svg.append('svg:defs');

defs.append("svg:pattern")
.attr("id", "myPattern")
.attr("width", 1)
.attr("height", 1)
.append("svg:image")
.attr("xlink:href", "https://github.com/favicon.ico")
.attr("width", 16)
.attr("height", 16)
.attr("x", 0)
.attr("y", 0);

var simulation = d3.forceSimulation()
.force("link", d3.forceLink().id(function(d) {
return d.id;
}).distance(100))
.force("collide", d3.forceCollide(50))
.force("charge", d3.forceManyBody())
.force("center", d3.forceCenter(width / 2, height / 2));

link = svg.selectAll(".link")
.data(links, function(d) {
return d.target.id;
})

link = link.enter()
.append("line")
.attr("class", "link");

node = svg.selectAll(".node")
.data(nodes, function(d) {
return d.id;
})

node = node.enter()
.append("g")
.attr("class", "node")
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));

node.append("circle")
.attr("r", 10)
.style("fill", "url(#myPattern)")

simulation
.nodes(nodes)
.on("tick", ticked);

simulation.force("link")
.links(links);


function ticked() {
link
.attr("x1", function(d) {
return d.source.x;
})
.attr("y1", function(d) {
return d.source.y;
})
.attr("x2", function(d) {
return d.target.x;
})
.attr("y2", function(d) {
return d.target.y;
});

node
.attr("transform", function(d) {
return "translate(" + d.x + ", " + d.y + ")";
});
}

function dragstarted(d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart()
}

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

function dragended(d) {
if (!d3.event.active) simulation.alphaTarget(0);
d.fx = undefined;
d.fy = undefined;
}
.link {
stroke: #aaa;
}

.node {
pointer-events: all;
stroke: none;
stroke-width: 40px;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="500" height="300"></svg>

关于javascript - d3.js 力定向图 - 使用图像而不是圆圈作为节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40874162/

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