d3.js select 鼠标悬停时连接节点
d3.js select connected nodes on mouseover
我试图在鼠标悬停时将所有连接节点的标签文本加粗。从评论中可以看出,尝试了各种程序,但仍然无法正常工作。我正在使用基于 http://bl.ocks.org/sjengle/5432087.
的圆图
我想要的是,当我将鼠标悬停在一个节点上时,我希望所有连接的节点都变成粗体。 (我现在拥有的是所有连接的线都变粗了,但我也想让线末端的节点突出显示 - 粗体)
对应代码如下:
function mouseovered(d) {
console.log("mouseOver");
//d3.select(this).style("font-weight", 700);
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name === d.name || l.target.name === d.name; })
.filter(function(l) { return l.value > 0; })
//.filter(function(l) { return console.log(l)})
//.style("font-weight", 700);
.style("stroke-width", "4px")
.style("stroke-opacity", 1);
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name != d.name && l.target.name != d.name; })
.filter(function(l) { return l.value > 0; })
//.filter(function(l) { return console.log(l)})
//.style("font-weight", 700);
//.style("stroke-width", "4px")
.style("stroke-opacity", 0.1);
linkList = d3.select("#plot").selectAll(".link")
//.filter(function(l) { return l.source.name != d.name && l.target.name != d.name; })
//.filter(function(l) { return l.source.name === d.name || l.target.name === d.name; })
.filter(function(l) { return if (l.source.name === d.name){return l.target.name} else if(l.target.name === d.name){return l.source.name; })
.filter(function(l) { return console.log("L.SOURCE:", l.source.name, "L.TARGET:", l.target.name); })
.filter(function(l) { return l.source.name, l.target.name; });
//console.log(linkList);
console.log("link:", linkList)
d3.select("#plot").selectAll(".nodeText")
//.filter(function(l) { return d3.select("#plot").selectAll(".link").filter(function(k) {return k.source.name === d.name || k.target.name === d.name ; })})
//.filter(function(l) { return d3.select("#plot").selectAll(".link").filter(function(k) {return k.value > 0 ; })})
.filter(function(l) { return l.name === "OP PPR_07.1 Posílení výzkumu, technologického rozvoje a inovací"})
.filter(function(l) { return l.name === linkList})
.style("font-weight", 700);
}
这是我的数据格式:
{"nodes": [{"name": "OP PIK_01.1 Rozvoj výzkumu a vývoje pro inovace", "group": 1}, {"name": "OP PIK_01.2 Rozvoj podnikání a konkurenceschopnosti malých a středních podniků", "group": 1}, {"name": "OP PIK_01.3 Účinné nakládání energií, rozvoj energetické infrastruktury a obnovitelných zdrojů energie, podpora zavádění nových technologií v oblasti nakládání energií a druhotných surovin", "group": 1}, {"name": "OP PIK_01.4 Rozvoj vysokorychlostních přístupových sítí k internetu a informačních a komunikačních technologií", "group": 1}, {"name": "OP PIK_01.5 Technická pomoc", "group": 1}, ...
, {"name": "", "group": 2}, {"name": "", "group": 4}, {"name": "", "group": 6}, {"name": "", "group": 8}, {"name": "", "group": 10}, {"name": "", "group": 12}, {"name": "", "group": 14}, {"name": "", "group": 16}
], "links": [{"value": 0.13757455268389662, "target": 1, "source": 0}, {"value": 0.07236842105263158, "target": 2, "source": 0}, {"value": 0.03948896631823461, "target": 3, "source": 0}, {"value": 0.0, "target": 4, "source": 0}, {"value": 0.007836990595611285, "target": 5, "source": 0}, {"value": 0.009244992295839754, "target": 6, "source": 0}, {"value": 0.0005341167044999333, "target": 7, "source": 0}, {"value": 0.0, "target": 8, "source": 0}, {"value": 0.06844336765596608, "target": 9, "source": 0}, {"value": 0.0, "target": 10, "source": 0}, {"value": 0.0014781966001478197, "target": 11, "source": 0}, {"value": 0.0, "target": 12, "source": 0}, {"value": 0.0, "target": 13, "source": 0}, {"value": 0.0, "target": 14, "source": 0}, {"value": 0.0, "target": 15, "source": 0}, {"value": 0.0, "target": 16, "source": 0}, {"value": 0.0, "target": 17, "source": 0}, {"value": 0.0, "target": 18, "source": 0}, {"value": 0.004398826979472141, "target": 19, "source": 0}, {"value": 0.0018248175182481751, "target": 20, "source": 0}, {"value": 0.0, "target": 21, "source": 0}, {"value": 0.0022197558268590455, "target": 22, "source": 0}, {"value": 0.0, "target": 23, "source": 0}, ... ]}
使用原始的 Miserable 节点和链接,我发现以下代码可以工作。
function mouseover(d) {
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name === d.name || l.target.name === d.name; })
.filter(function(l) { return l.value > 0; })
.classed("highlight", true);
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name != d.name && l.target.name != d.name; })
.filter(function(l) { return l.value > 0; })
.classed("downlight", true);
d3.select("#plot").selectAll(".node")
.each(function(n) {
for (let index = 0; index < graphData.links.length; index++) {
const element = graphData.links[index];
if ( (element.source.name === d.name && element.target.name === n.name) ||
(element.target.name === d.name && element.source.name === n.name)
) {
d3.select(this).attr("r", 8);
return;
}
}
});
}
function mouseout(d) {
d3.select("#plot").selectAll(".link")
.classed("highlight downlight", false);
d3.select("#plot").selectAll(".node")
.attr("r", 5)
.classed("highlight", false);
}
// Draws nodes with tooltips
function drawNodes(nodes) {
// used to assign nodes color by group
var color = d3.scale.category20();
d3.select("#plot").selectAll(".node")
.data(nodes)
.enter()
.append("circle")
.attr("class", "node")
.attr("id", function(d, i) { return d.name; })
.attr("cx", function(d, i) { return d.x; })
.attr("cy", function(d, i) { return d.y; })
.attr("r", 5)
.style("fill", function(d, i) { return color(d.group); })
.on("mouseover", function(d, i) { addTooltip(d3.select(this)); mouseover(d); })
.on("mouseout", function(d, i) { d3.select("#tooltip").remove(); mouseout(); });
}
你也需要一点CSS
.node {
stroke: #ffffff;
stroke-width: 1px;
}
.node.highlight {
stroke: #0000;
stroke-width: 3px;
}
.link {
fill: none;
stroke: #888888;
stroke-width: 1px;
stroke-opacity: 0.5;
}
.link.highlight {
stroke: red;
stroke-opacity: 1.0;
}
.downlight {
stroke-opacity: 0.1;
}
以及图形数据的保存
var graphData = null;
// Draws an arc diagram for the provided undirected graph
function drawGraph(graph) {
graphData = graph; // save for later in mouseover
....
}
我试图在鼠标悬停时将所有连接节点的标签文本加粗。从评论中可以看出,尝试了各种程序,但仍然无法正常工作。我正在使用基于 http://bl.ocks.org/sjengle/5432087.
的圆图我想要的是,当我将鼠标悬停在一个节点上时,我希望所有连接的节点都变成粗体。 (我现在拥有的是所有连接的线都变粗了,但我也想让线末端的节点突出显示 - 粗体)
对应代码如下:
function mouseovered(d) {
console.log("mouseOver");
//d3.select(this).style("font-weight", 700);
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name === d.name || l.target.name === d.name; })
.filter(function(l) { return l.value > 0; })
//.filter(function(l) { return console.log(l)})
//.style("font-weight", 700);
.style("stroke-width", "4px")
.style("stroke-opacity", 1);
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name != d.name && l.target.name != d.name; })
.filter(function(l) { return l.value > 0; })
//.filter(function(l) { return console.log(l)})
//.style("font-weight", 700);
//.style("stroke-width", "4px")
.style("stroke-opacity", 0.1);
linkList = d3.select("#plot").selectAll(".link")
//.filter(function(l) { return l.source.name != d.name && l.target.name != d.name; })
//.filter(function(l) { return l.source.name === d.name || l.target.name === d.name; })
.filter(function(l) { return if (l.source.name === d.name){return l.target.name} else if(l.target.name === d.name){return l.source.name; })
.filter(function(l) { return console.log("L.SOURCE:", l.source.name, "L.TARGET:", l.target.name); })
.filter(function(l) { return l.source.name, l.target.name; });
//console.log(linkList);
console.log("link:", linkList)
d3.select("#plot").selectAll(".nodeText")
//.filter(function(l) { return d3.select("#plot").selectAll(".link").filter(function(k) {return k.source.name === d.name || k.target.name === d.name ; })})
//.filter(function(l) { return d3.select("#plot").selectAll(".link").filter(function(k) {return k.value > 0 ; })})
.filter(function(l) { return l.name === "OP PPR_07.1 Posílení výzkumu, technologického rozvoje a inovací"})
.filter(function(l) { return l.name === linkList})
.style("font-weight", 700);
}
这是我的数据格式:
{"nodes": [{"name": "OP PIK_01.1 Rozvoj výzkumu a vývoje pro inovace", "group": 1}, {"name": "OP PIK_01.2 Rozvoj podnikání a konkurenceschopnosti malých a středních podniků", "group": 1}, {"name": "OP PIK_01.3 Účinné nakládání energií, rozvoj energetické infrastruktury a obnovitelných zdrojů energie, podpora zavádění nových technologií v oblasti nakládání energií a druhotných surovin", "group": 1}, {"name": "OP PIK_01.4 Rozvoj vysokorychlostních přístupových sítí k internetu a informačních a komunikačních technologií", "group": 1}, {"name": "OP PIK_01.5 Technická pomoc", "group": 1}, ...
, {"name": "", "group": 2}, {"name": "", "group": 4}, {"name": "", "group": 6}, {"name": "", "group": 8}, {"name": "", "group": 10}, {"name": "", "group": 12}, {"name": "", "group": 14}, {"name": "", "group": 16}
], "links": [{"value": 0.13757455268389662, "target": 1, "source": 0}, {"value": 0.07236842105263158, "target": 2, "source": 0}, {"value": 0.03948896631823461, "target": 3, "source": 0}, {"value": 0.0, "target": 4, "source": 0}, {"value": 0.007836990595611285, "target": 5, "source": 0}, {"value": 0.009244992295839754, "target": 6, "source": 0}, {"value": 0.0005341167044999333, "target": 7, "source": 0}, {"value": 0.0, "target": 8, "source": 0}, {"value": 0.06844336765596608, "target": 9, "source": 0}, {"value": 0.0, "target": 10, "source": 0}, {"value": 0.0014781966001478197, "target": 11, "source": 0}, {"value": 0.0, "target": 12, "source": 0}, {"value": 0.0, "target": 13, "source": 0}, {"value": 0.0, "target": 14, "source": 0}, {"value": 0.0, "target": 15, "source": 0}, {"value": 0.0, "target": 16, "source": 0}, {"value": 0.0, "target": 17, "source": 0}, {"value": 0.0, "target": 18, "source": 0}, {"value": 0.004398826979472141, "target": 19, "source": 0}, {"value": 0.0018248175182481751, "target": 20, "source": 0}, {"value": 0.0, "target": 21, "source": 0}, {"value": 0.0022197558268590455, "target": 22, "source": 0}, {"value": 0.0, "target": 23, "source": 0}, ... ]}
使用原始的 Miserable 节点和链接,我发现以下代码可以工作。
function mouseover(d) {
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name === d.name || l.target.name === d.name; })
.filter(function(l) { return l.value > 0; })
.classed("highlight", true);
d3.select("#plot").selectAll(".link")
.filter(function(l) { return l.source.name != d.name && l.target.name != d.name; })
.filter(function(l) { return l.value > 0; })
.classed("downlight", true);
d3.select("#plot").selectAll(".node")
.each(function(n) {
for (let index = 0; index < graphData.links.length; index++) {
const element = graphData.links[index];
if ( (element.source.name === d.name && element.target.name === n.name) ||
(element.target.name === d.name && element.source.name === n.name)
) {
d3.select(this).attr("r", 8);
return;
}
}
});
}
function mouseout(d) {
d3.select("#plot").selectAll(".link")
.classed("highlight downlight", false);
d3.select("#plot").selectAll(".node")
.attr("r", 5)
.classed("highlight", false);
}
// Draws nodes with tooltips
function drawNodes(nodes) {
// used to assign nodes color by group
var color = d3.scale.category20();
d3.select("#plot").selectAll(".node")
.data(nodes)
.enter()
.append("circle")
.attr("class", "node")
.attr("id", function(d, i) { return d.name; })
.attr("cx", function(d, i) { return d.x; })
.attr("cy", function(d, i) { return d.y; })
.attr("r", 5)
.style("fill", function(d, i) { return color(d.group); })
.on("mouseover", function(d, i) { addTooltip(d3.select(this)); mouseover(d); })
.on("mouseout", function(d, i) { d3.select("#tooltip").remove(); mouseout(); });
}
你也需要一点CSS
.node {
stroke: #ffffff;
stroke-width: 1px;
}
.node.highlight {
stroke: #0000;
stroke-width: 3px;
}
.link {
fill: none;
stroke: #888888;
stroke-width: 1px;
stroke-opacity: 0.5;
}
.link.highlight {
stroke: red;
stroke-opacity: 1.0;
}
.downlight {
stroke-opacity: 0.1;
}
以及图形数据的保存
var graphData = null;
// Draws an arc diagram for the provided undirected graph
function drawGraph(graph) {
graphData = graph; // save for later in mouseover
....
}