Tôi có biểu đồ mạng (đồ thị theo hướng lực), một phân tán và một bảng được kết nối với nhau (xem jsFiddle). Tôi có các liên kết hoạt động theo cách tôi muốn chúng cho các sự kiện di chuột qua. Tôi muốn sửa đổi mã của mình để khi di chuột qua một nút trong sơ đồ mạng, không chỉ là nút được kết hợp được đánh dấu (và các kết nối của nó trong phân tán và bảng), nhưng các nút lân cận ngay lập tức cũng được đánh dấu (như kết nối của họ trong phân tán và bảng).áp dụng một số sự kiện di chuột đến các nút lân cận (kết nối)
Tôi đã xem thông tin trong số Highlight selected node, its links, and its children in a D3 force directed graph để được trợ giúp. Một nơi nào đó trên đường đi (không chính xác chắc chắn nơi) Tôi tìm thấy một ví dụ về một chức năng giúp xác định các nút kết nối, isConnected()
.
function isConnected(a, b) {
return linkedByIndex[a.index + "," + b.index] || linkedByIndex[b.index + "," + a.index] || a.index == b.index;
}
Tôi muốn kết hợp chức năng này vào các sự kiện mouseover của tôi, có lẽ với một tuyên bố if()
, vì vậy mà tôi có thể làm tất cả các "nổi bật" mà tôi muốn. Nhưng, tôi mới đến D3 và js và không chắc chắn làm thế nào để thiết lập nó.
Dưới đây là đoạn mã (từ số jsFiddle) mà tôi muốn sửa đổi. Tôi sẽ đánh giá cao bất kỳ gợi ý hoặc gợi ý cho các ví dụ khác.
var node = svg.selectAll(".node")
.data(graph.nodes)
.enter().append("g")
.attr("class", function(d) { return "node " + d.name + " " + d.location; })
.call(force.drag)
.on("mouseover", function(d) {
// I would like to insert an if statement to do all of these things to the connected nodes
// if(isConnected(d, o)) {
d3.select(this).select("circle").style("stroke-width", 6);
d3.select(this).select("circle").style("stroke", "orange");
d3.select(this).select("text").style("font", "20px sans-serif");
d3.selectAll("rect." + d.location).style("stroke-width", 6);
d3.selectAll("rect." + d.location).style("stroke", "orange");
d3.selectAll("text." + d.location).style("font", "20px sans-serif");
d3.selectAll("tr." + d.name).style("background-color", "orange");
//}
})
.on("mouseout", function(d) {
// if(isConnected(d, o)) {
d3.select(this).select("circle").style("stroke-width", 1.5);
d3.select(this).select("circle").style("stroke", "gray");
d3.select(this).select("text").style("font", "12px sans-serif");
d3.selectAll("rect." + d.location).style("stroke-width", 1.5);
d3.selectAll("rect." + d.location).style("stroke", "gray");
d3.selectAll("text." + d.location).style("font", "12px sans-serif");
d3.selectAll("tr." + d.name).style("background-color", "white");
//}
});
Điều này hữu ích, nhưng nó chỉ áp dụng hàng xóm làm nổi bật sơ đồ mạng. Tôi cũng muốn làm nổi bật các bit tương ứng trong bảng và bản đồ. Vì vậy, ví dụ, khi tôi di chuyển GroupA, tôi muốn Jim, Sally và Tom có (1) vòng tròn được đánh dấu trong sơ đồ mạng (mã của bạn địa chỉ này), (2) các hàng được tô sáng trong bảng và (3) được tô sáng hình chữ nhật trong bản đồ. Bạn có thể giúp tôi với các bộ phận 2 và 3 không? –
Dường như hình chữ nhật của bạn và có thể bảng của bạn không liên kết dữ liệu giống như D3. Nhưng không có lý do bạn không thể sử dụng d3 lựa chọn anyway. Bí quyết sẽ là sử dụng mảng các chỉ mục nút lân cận để thực sự có được danh sách các nút hoặc thuộc tính chính xác để làm nổi bật các mục khác. thì bạn sẽ có thể áp dụng cùng một logic. – Superboggly
Bạn có thể cho tôi gợi ý về cách thực hiện việc này không? Tôi cố gắng \t \t \t \t 'd3.selectAll ("rect." + D.location) .filter (function (node) { trở nodeNeighbors.indexOf (node.index)> -1; }) .style (" đột quỵ "," cyan ");" nhưng, rõ ràng, điều đó không hiệu quả. –