Поиск элемента в D3 — принудительное расположение или дерево

Есть ли пример поиска элемента в макете d3js (направленного усилия или дерева) и выделения этого элемента?

Я думаю, что будет текстовое поле, в котором пользователь вводит значения для поиска.


person nilanjan    schedule 05.12.2012    source источник
comment
как добавить поиск, чтобы заставить макет? Пожалуйста, проверьте этот Поиск элемента в D3 Force Layout   -  person Ehsan Mohammadi    schedule 16.10.2016


Ответы (4)


Я написал инструмент, который позволяет просматривать биологические регуляторные сети, показывая две панели SVG рядом друг с другом. Каждая панель содержит сеть транскрипционных факторов (узлов) принудительной компоновки, нарисованную API d3.js. Вы можете ввести название фактора транскрипции, и он будет выделен с использованием того же кода, который используется при возникновении события mouseover. Изучение кода может дать вам некоторое представление о том, как это делается.

person Alex Reynolds    schedule 05.12.2012
comment
это хорошая демонстрация, вы где-нибудь погрузились в процесс создания? Может быть, блог или что-то в этом роде? - person BBischof; 02.09.2014
comment
Ваш код выдает некоторые ошибки в консоли. вы можете взглянуть на это - person Shenal Silva; 14.09.2014

Вот суть, которую я составил. Возможно, это важно?

Я разбил свою реализацию на 3 этапа:

1) При выборе имени конечного узла в поле select2 searchTree.

$("#search").on("select2-selecting", function(e) {
    var paths = searchTree(root,e.object.text,[]);
    if(typeof(paths) !== "undefined"){
        openPaths(paths);
    }
    else{
        alert(e.object.text+" not found!");
    }
})

2) searchTree возвращает массив узлов в порядке удаления от корневого узла (пути)

function searchTree(obj,search,path){
    if(obj.name === search){ //if search is found return, add the object to the path and return it
        path.push(obj);
        return path;
    }
    else if(obj.children || obj._children){ //if children are collapsed d3 object will have them instantiated as _children
       var children = (obj.children) ? obj.children : obj._children;
       for(var i=0;i<children.length;i++){
            path.push(obj);// we assume this path is the right one
            var found = searchTree(children[i],search,path);
            if(found){// we were right, this should return the bubbled-up path from the first if statement
                return found;
            }
            else{//we were wrong, remove this parent from the path and continue iterating
                path.pop();
            }
        }
    }
    else{//not the right object, return false so it will continue to iterate in the loop
        return false;
    }
}

3) откройте путь, заменив «._children» на «.children» и добавьте класс «found», чтобы покрасить все в красный цвет. (см. экземпляры ссылок и узлов)

function openPaths(paths){
    for(var i=0;i<paths.length;i++){
        if(paths[i].id !== "1"){//i.e. not root
            paths[i].class = 'found';
            if(paths[i]._children){ //if children are hidden: open them, otherwise: don't do anything
                paths[i].children = paths[i]._children;
                paths[i]._children = null;
            }
            update(paths[i]);
        }
     }
}

Я понимаю, что это может быть не самый оптимальный способ сделать это, но эй, работа сделана :)

person Jake Zieve    schedule 18.09.2014
comment
Спасибо, что поделились своим кодом. Кажется, что функция searchTree не находит несколько результатов, когда у вас есть одно и то же имя в двух разных узлах. Есть ли более простое решение, как уже упоминалось, на основе selectAll? - person PBrockmann; 21.11.2014

Я закодировал решение с виджетом поиска на основе select2.
Вы получаете найденные узлы с развернутыми путями, выделенными красным цветом.
Дерево полностью изучено, и можно найти несколько ответов.

Сворачиваемое дерево поиска
https://gist.github.com/PBrockmann/0f22818096428b12ea23

Надеюсь, это поможет
Патрик

person PBrockmann    schedule 22.11.2014
comment
Когда я ищу узел в раскрывающемся списке, повторяющиеся значения отображаются - почему это так? ? - person d-_-b; 06.07.2015
comment
неважно, я нашел проблему. Вокруг строки 205 вашего кода код - select2Data.sort(function(a, b) - повторяется. Я удалил один из них, и это сработало. - person d-_-b; 13.07.2015

Разве вы не просите d3.selectAll ?

https://github.com/mbostock/d3/wiki/Selections#wiki-d3_selectAll

  1. Используйте текстовое поле с кнопкой поиска.
  2. Переведите поиск в селектор D3/CSS3 в ваших узлах.
  3. d3.выбрать все
  4. Примените новые стили к узлам, которые соответствуют или не соответствуют вашему запросу.
person Glenn    schedule 05.12.2012
comment
Есть простой пример? Я новичок как в d3, так и в javascript. Спасибо, в любом случае. Я думаю, я могу решить это. - person nilanjan; 08.12.2012
comment
mbostock.github.com/d3/talk/20111116/force-collapsible. html Просто сделайте selectall, как это vis.selectAll(circle.node), но за исключением поиска круга с узлом класса, измените критерии на все, что вам нравится. Это ссылка на выбор: w3.org/TR/css3-selectors/#selectors, где circle.node — это строка E.warning (например, селектор класса) - person Glenn; 10.12.2012