D3根据部分数据突出显示

时间:2016-03-24 19:49:53

标签: javascript d3.js

这是我的数据(JSON),数据是这样的150,000多行。我正在使用这些数据绘制D3中节点和节点之间的线,我有非常好的代码。

"nodes" : [{
            "id" : "r75832",
            "name" : "name1",
            "x" : 1209,
            "y" : 41
        }, {
            "id" : "q26475",
            "name" : "name2",
            "x" : 483,
            "y" : 227
        }, 
.
.
.

"links" : [{
            "id" : "abc ",
            "name" : "t5.4.6.2 , 4.5.0.7, p00738",
            "x1" : 348,
            "y1" : 341,
            "x2" : 349,
            "y2" : 340,
            "x3" : 351,
            "y3" : 340,
            "x4" : 350,
            "y4" : 341
        }, {
            "id" : "def ",
            "name" : "a1.2.3.4 , 6.7.8.9, b00574",
            "x1" : 349,
            "y1" : 340,
            "x2" : 349,
            "y2" : 339,
            "x3" : 351,
            "y3" : 339,
            "x4" : 351,
            "y4" : 340
        },
.
.
.

我还有一段代码可以创建一个下拉菜单:

'E met' : {
  'a met' : {
    'M00175 name1' : {},
   },
  'b met' : {
    'M00567 name2' : {},
    'M00174 name3' : {},
   },

.
.
.
}

我想要的是,当有人点击M00174时,在下拉菜单中我想要突出显示一些节点,当有人点击M00567时,其他一些节点将被突出显示属于M00567,依此类推。

我在这一点上陷入困​​境,如何定义特定的数据片段,使其在150,000多行代码中突出显示,以及如何突出显示它们。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我这样做的方法就是在更改下拉列表时调用函数。然后循环节点以给它们一个边框(突出显示)。

这是我放在一起的小提琴:https://jsfiddle.net/reko91/dFK3K/287/

首先,我创建了这组数据中所有不同组的数组:

var arrayOfGroups = [];

function makearray() {

  node.each(function(d) {
    if (arrayOfGroups.indexOf(d.group) < 0) {
      arrayOfGroups.push(d.group)
    }
  })
  console.log(arrayOfGroups)
  return arrayOfGroups;
}

这基本上是通过每个节点进行的,如果我创建的数组没有得到该组,则会将该组推入其中。

然后我根据这个数组创建一个下拉列表:

function creatSelectDropDown(id, array) {

  var dropdown = document.createElement("select");
  dropdown.id = id;

  for (var i = 0; i < array.length; i++) {
    var option = document.createElement("option");
    option.text = array[i];
    option.value = array[i];
    dropdown.options.add(option);
  }


  return dropdown; //return drop down list
}

获取容器(我在html中添加了一个div):

var container = document.getElementById('selectContainer')

获取生成的下拉列表:

var dropdown = creatSelectDropDown('thisDropdown', newArray);

将此创建的选择下拉到容器:

container.appendChild(dropdown)

然后创建了一个on change函数:

dropdown.onchange = function(event) {
  console.log(event)
  node.style('stroke', 'white') //this is to set all nodes to default stroke
    .style('stroke-width', '1px');

  node.filter(function(d) {
      return d.group == event.target.value;
    })
    .each(function(d) {
      console.log(d)
      console.log('d')
    })
    .style('stroke', 'red')
    .style('stroke-width', '5px')
}

这样做是获取select on change的值,使用此值来过滤具有等于该值的组的节点。

就是这样。更改下拉列表时,它会获取下拉列表中选项的值,将节点过滤为具有等于选项标记的组的节点,并向所有节点添加笔划:)