【问题标题】:networkD3 package: show node names of all connected nodes when hovering overnetworkD3 包:悬停时显示所有连接节点的节点名称
【发布时间】:2019-05-18 21:07:20
【问题描述】:

使用networkD3 包的forceNetwork 函数,可以创建一个交互式网络图,当鼠标悬停在节点上时可以显示节点名称。

我正在尝试创建一个图表,该图表不仅显示鼠标悬停的节点,还显示所有相邻节点,即直接连接到所选节点的所有节点。但是,它不应该显示任何不直接连接到节点的节点。

虽然我找到了参数opacityNoHover,但它会影响到所有鼠标没有覆盖的节点,而不仅仅是直接连接的节点。

library(networkD3)
# example data
data(MisLinks)
data(MisNodes)

# creating the plot
 forceNetwork(Links = MisLinks, Nodes = MisNodes,
         Source = "source", Target = "target",
         Value = "value", NodeID = "name",
         Group = "group", opacity = 1, fontSize = 15,
         opacityNoHover = 0)

【问题讨论】:

    标签: r d3.js htmlwidgets networkd3


    【解决方案1】:

    您可以重写mouseovermouseout 函数并用htmlwidgets::onRender 覆盖它们...

    library(networkD3)
    library(htmlwidgets)
    
    data(MisLinks)
    data(MisNodes)
    
    fn <- forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source", 
                       Target = "target", Value = "value", NodeID = "name",
                       Group = "group", opacity = 1, fontSize = 15, 
                       opacityNoHover = 0)
    customJS <- '
    function(el,x) { 
        var link = d3.selectAll(".link")
        var node = d3.selectAll(".node")
    
        var options = { opacity: 1,
                        clickTextSize: 10,
                        opacityNoHover: 0.1,
                        radiusCalculation: "Math.sqrt(d.nodesize)+6"
                      }
    
        var unfocusDivisor = 4;
    
        var links = HTMLWidgets.dataframeToD3(x.links);
        var linkedByIndex = {};
    
        links.forEach(function(d) {
          linkedByIndex[d.source + "," + d.target] = 1;
          linkedByIndex[d.target + "," + d.source] = 1;
        });
    
        function neighboring(a, b) {
          return linkedByIndex[a.index + "," + b.index];
        }
    
        function nodeSize(d) {
                if(options.nodesize){
                        return eval(options.radiusCalculation);
                }else{
                        return 6}
        }
    
        function mouseover(d) {
          var unfocusDivisor = 4;
    
          link.transition().duration(200)
            .style("opacity", function(l) { return d != l.source && d != l.target ? +options.opacity / unfocusDivisor : +options.opacity });
    
          node.transition().duration(200)
            .style("opacity", function(o) { return d.index == o.index || neighboring(d, o) ? +options.opacity : +options.opacity / unfocusDivisor; });
    
          d3.select(this).select("circle").transition()
            .duration(750)
            .attr("r", function(d){return nodeSize(d)+5;});
    
          node.select("text").transition()
            .duration(750)
            .attr("x", 13)
            .style("stroke-width", ".5px")
            .style("font", 24 + "px ")
            .style("opacity", function(o) { return d.index == o.index || neighboring(d, o) ? 1 : 0; });
        }
    
        function mouseout() {
          node.style("opacity", +options.opacity);
          link.style("opacity", +options.opacity);
    
          d3.select(this).select("circle").transition()
            .duration(750)
            .attr("r", function(d){return nodeSize(d);});
          node.select("text").transition()
            .duration(1250)
            .attr("x", 0)
            .style("font", options.fontSize + "px ")
            .style("opacity", 0);
        }
    
        d3.selectAll(".node").on("mouseover", mouseover).on("mouseout", mouseout);
    }
    '
    onRender(fn, customJS)
    

    【讨论】:

    • 在这个例子中,如何在变量中捕获节点名称(悬停时)?
    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多