代码之家  ›  专栏  ›  技术社区  ›  VincentDM

如何获取数据?

  •  0
  • VincentDM  · 技术社区  · 6 年前

    我正在为一个图形可视化项目启动JavaScript和D3,我不知道如何获得我想要的数据。我想我只是不知道一些基本的JS元素。。。

    我有一些节点和链接。。。

    var nodes_data = [
    {"id": "Node 1"},
    {"id": "Node 2"},
    {"id": "Node 3"},
    {"id": "Node 4"},
    {"id": "Node 5"}]
    
    var links_data = [
    {"source": "Node 1", "target":"Node 4"},
    {"source": "Node 2", "target":"Node 1"},
    {"source": "Node 1", "target":"Node 5"},
    {"source": "Node 4", "target":"Node 3"},
    {"source": "Node 5", "target":"Node 3"}]
    

    我只想在选择一个节点时突出显示一个链接。我的节点是这样设置的。。。

    var linksRef =
    svgRef.append("g")
        .attr("class", "links")
    .selectAll("line")
    .data(links_data).enter()
    .append("line");
    
    var nodesRef =
    svgRef.append("g")          
        .attr("class", "nodes")
    .selectAll("circle")    
    .data(nodes_data).enter()
    .append("circle")
        .attr("r", nodeRadius)
        .on("mouseover", mouseOver)
        .on("mouseout", mouseOut);
    

    我希望通过这种方式更改悬停节点的链接颜色。。。

    function mouseOver(d) {
      var nodeId = d.id;
      d3.selectAll("links")
        .filter(function (d) { return d.source === nodeId })
        .style("stroke", "red");
    }
    

    我确实试着去替换 links 那里有 .links link .link 但这些只是在黑暗中拍摄。当我将这些输出到控制台时,总是得到空数组。显然有些JS或D3的东西我没抓住!

    在这种情况下,访问和过滤数据的正确方法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gerardo Furtado    6 年前

    你有几个选择。

    d3.selectAll("links") 将全选 links SVG中的元素。那显然行不通,因为 <links> SVG规范中的元素。

    因此,一种解决方案是选择行:

    d3.selectAll("line")
    

    另一种方法是,如果SVG中有其他行,则使用选择:

    linksRef.selectAll("line")
    

    最后,你可以设置一个类。。。

    var linksRef = svgRef.append("g")
        .attr("class", "links")
        .selectAll("line")
        .data(links_data).enter()
        .append("line")
        .attr("class", "link")
    

    ... 按类别选择:

    d3.selectAll(".link")