【发布时间】:2020-10-05 18:28:23
【问题描述】:
我正在尝试使用 d3.js 创建一个径向(圆形)分组圆,类似于:
我写了一些如下代码。
但我不知道如何将每个圆圈与曲线连接起来,当鼠标悬停圆圈时,上面的圆圈会显示一个工具提示,怎么做?帮助将不胜感激。谢谢。
我更新了我的代码,现在我可以在大圆圈中画圆或图像元素了。
const mockedData = {
"nodes": [
{
"name": "Node1one",
"label": "Node1",
"id": 1,
"x": 120,
"y": 120,
},
{
"name": "Node2",
"label": "Node2",
"id": 2,
"x": 350,
"y": 180,
},
]
}
const imgList = {
"images": [
{
"image": 'https://via.placeholder.com/30x30',
"x": -50,
},
{
"image": 'https://via.placeholder.com/30',
"x": 20
}
]
}
const svg = d3.select("svg");
const width = +svg.attr("width");
const height = +svg.attr("height");
let { links, nodes } = mockedData;
let { images } = imgList;
const ticked = ( node) => {
node.attr("transform",
function (d) {return "translate(" + d.x + ", " + d.y + ")";});
}
const tickedImg = (nodeImg) => {
nodeImg.attr("x", function (d) {return d.x })
}
const node = svg.selectAll(".node")
.data(nodes)
.enter()
.append("g")
.attr("class", "node")
node.append('circle').attr("r", 86); //radius
svg.selectAll('circle')
.on('click', function () { // arrow function will produce this = undefined
d3.selectAll('circle')
.style("fill", "lightgray");
d3.select(this)
.style("fill", "aliceblue");
})
.on('mouseover', function () {
d3.selectAll('circle')
.style("stroke", "black");
d3.select(this)
.style("stroke", "green");
})
ticked( node )
const nodeText = node.append("text")
.attr("y", -70);
nodeText.selectAll("tspan.text")
.data((d) => d.name.split(" "))
.enter()
.append("tspan")
.attr("class", "text")
.text(d => d)
.attr("x", -30)
.attr("y", -60)
node.append("title")
.text(function (d) {return d.id;});
const nodeImg = node.selectAll("image")
.data(images)
.enter()
.append("image")
.attr("xlink:href", (d) => d.image)
.attr("width", 27)
.attr("height", 30)
tickedImg (nodeImg)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg width="100%" viewbox="0 0 2000 1000"></svg>
【问题讨论】:
-
@Alex L 谢谢你的代码
-
不用担心,尽可能设置一个最小的可重现示例 - 代码 sn-ps 有助于此。如果我以后有时间,我会发布一个答案。快速提问,
mockedData.nodes每个节点应该使用哪些链接?你有links: [1,2]和links: [2,3]但你的mockedData.links只有两个链接?第二个链接的目标是 3,但是 3 在哪里? -
@Alex L 谢谢,是的,每个节点都应该使用链接。我最初的想法是大圆圈中有3个小圆圈,链接的数量决定了之间连接线的数量小圈子。我的英文不是很好,不知道我的表述清楚吗?
-
期待您的回复
-
抱歉@Janily 我不明白
links: [1,2]和links: [2,3]和mockedData.links是如何与您共享的图像相关联的?能再解释一下吗?如果您愿意,也可以在这里用您的母语发表评论,如果我不明白(我会说英语、德语和一点西班牙语),我会使用谷歌翻译?
标签: javascript css d3.js svg