Изменчивый treemap отлично, но есть одна функция, которая, по моему мнению, сделает ее еще более важной. При наведении мыши на прямоугольники (до или после масштабирования) нет простого способа узнать, где находится иерархия прямоугольника, и каков его размер.
Я новичок в D3, но мне интересно, какие изменения мне нужно сделать, чтобы иметь подсказку для зависания, как показано ниже. Является ли это относительно легко исправить, или это сильно изменило исходный код? Где я могу начать?
Вы можете зарегистрировать другой обработчик событий, когда ячейки вводятся сразу после функции масштабирования. В приведенном примере соответствующий код будет выглядеть следующим образом:
var cell = svg.selectAll("g")
.data(nodes)
.enter().append("svg:g")
.attr("class", "cell")
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
.on("click", function(d) { return zoom(node == d.parent ? root : d.parent); });
Для этого вы можете добавить в другой обработчик для мыши и внутри этой функции подойти к дереву, записав имя каждого родительского узла до тех пор, пока не будет больше родительских узлов, а затем запишите список в ваш popover. Давайте предположим только ради этого примера, что вы настраиваете свою подсказку, как показано на вашем изображении, и вы указали ей идентификатор tooltip
.
Тогда вы можете использовать обработчик следующим образом:
.on('mouseover', function(d) {
// this variable will be used in a loop to store the current node being inspected
var currentNode = d;
// this array will hold the names of each subsequent parent node
var nameList = [currentNode.name];
// as long as the current node has a parent...
while (typeof currentNode.parent === 'object') {
// go up a level in the hierarchy
currentNode = currentNode.parent;
// add the name to the beginning of the list
nameList.unshift(currentNode.name);
}
// now nameList should look like ['flare','animate','interpolate']
// join the array with slashes (as you have in your example)
nameList = nameList.join('/');
// now nameList should look like 'flare/animate/interpolate'
// use this to set the tooltip text
$('#tooltip').text('Mouse hovering ' + nameList + '. Cell size = ' + d.area);
}
"mouseover"
:d3.select(this).attr("stroke:pink")
без удачи. Есть мысли, почему это не работает?