【发布时间】:2016-11-29 02:26:03
【问题描述】:
我希望中间的九英寸钉子节点是一个图像,但其余节点只是圆形。遵循这个answer 似乎并不太难,但我就是无法理解 svg、defs、模式和 d3 的组合。
我的代码是:
var simulation =
d3.forceSimulation()
.force("charge", d3.forceManyBody().strength(-50))
.force("collide", d3.forceCollide().radius(function (d) { return 15 - d.group}).strength(2).iterations(2))
.force("link", d3.forceLink().id(function(d, i) { return i;}).distance(20).strength(0.9))
.force("center", d3.forceCenter(width/2, height/2))
.force('X', d3.forceX(width/2).strength(0.15))
.force('Y', d3.forceY(height/2).strength(0.15));
var link = svg.append("g")
.attr("class", "links")
.selectAll("line")
.data(graph.links)
.enter().append("line")
var defs = svg.append('svg:defs');
defs.append("svg:pattern")
.attr("id", "vit-icon")
.attr("width", 48)
.attr("height", 48)
.attr("patternUnits", "userSpaceOnUse")
.append("svg:image")
.attr("xlink:href", "http://placekitten.com/g/48/48")
.attr("width", 48)
.attr("height", 48)
.attr("x", width/2)
.attr("y", height/2)
var node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(graph.nodes)
.enter().append("circle")
.attr("id", function(d, i) { return 'c'+i})
.attr("r", radius)
.attr("fill", function(d) {
if(d.group==0) {return "url(#vit-icon)";}
else {return color(d.group); }
})
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
正如我所说,这在我的脑海中似乎是直截了当的。基本上我认为我想要做的是将图像放在 svg 模式中,然后使用 if 语句告诉我的根节点使用图像 url 而不是填充颜色。
在开发工具中,我可以看到检查图像,它显示了它将占用的蓝色区域,并且我希望它关联的节点具有 'url(#vit-icon)' 作为填充属性。但它没有显示该节点的图像或任何填充。
我做错了什么?或者这是完全错误的方法? 谢谢。
【问题讨论】:
标签: javascript node.js d3.js svg