2012-11-30 29 views
5

Mục tiêu của tôi là sử dụng bố cục lực d3 để hiển thị hai mạng khác nhau chia sẻ cùng một nút. Ví dụ, trong số bốn người, bạn có thể định nghĩa một mạng xã hội và một mạng lưới phả hệ; các nút sẽ giống nhau (mọi người) nhưng các liên kết (các mối quan hệ) có thể khác nhau. Mặc dù tạo hai bố cục lực riêng biệt, hai khung hình svg riêng biệt và cố gắng xác định các biến riêng biệt, các nút đang chia sẻ thông tin vị trí x và y. Dưới đây là một ví dụ rất nhỏ, trong đó kéo các nút trên một mạng thay đổi vị trí của họ trong mạng khác: http://amath.colorado.edu/student/larremore/nodesSharingPositiond3Nhiều trường hợp bố cục lực lượng d3 trên cùng một trang

Dưới đây, tôi đăng các chức năng đó được gọi là để tạo ra một trong những mạng lưới, và mã để tạo ra các khác là rất giống nhau, nhưng sử dụng tên biến khác nhau trong mọi trường hợp. Bạn có thể tìm thấy mã nhận xét để tạo cả hai mạng trong http://amath.colorado.edu/student/larremore/nodesSharingPositiond3/lib/minimal.js và tập lệnh được sử dụng để xác định các biến trong /driver/minimalScript.js < - Tôi không có đủ danh tiếng để liên kết trực tiếp. Lời xin lỗi của tôi!

Một nơi nào đó trong cách thức hoạt động của d3.force, thông tin vị trí là toàn cầu hoặc được chọn trên toàn cầu hoặc một thứ gì đó. Ai có thể làm sáng tỏ điều này? Tôi quan tâm cả hai trong một giải pháp để giữ thông tin vị trí tách biệt cũng như trong việc hiểu cách d3.force xử lý và cập nhật tính toán vị trí.

function makeYNet() { 

// This populates the YactiveLinks variable with the proper YLinks. The goal is to be able to only display links whose value is above some threshold. 
for (var i=0; i<YLinks.length; i++) { 
    if (YLinks[i].link2 > thr) { 
     YactiveLinks.push(YLinks[i]); 
    } 
} 

// Add nodes and links to forceY 
forceY 
.nodes(YNodes) 
.links(YactiveLinks); 

// Draw lines 
var Ylink = svgY.selectAll("line.link") 
.data(YactiveLinks) 
.enter() 
.append("line") 
.attr("class", "link") 
.style("stroke-width", 2.0); 

// Draw nodes 
var Ynode = svgY.selectAll("circle.node") 
.data(YNodes) 
.enter().append("circle") 
.attr("class", "node") 
.attr("r", radius) 
.attr("high",0) 
.attr("id", function(d,i) { 
     return ("idy" + i); 
     }) 
.style("fill", function(d) { return color(d.group1); }) 
.call(forceY.drag) 
; 

// Define tick 
forceY.on("tick", function() { 
      Ylink 
      .attr("x1", function(d) { return d.source.x; }) 
      .attr("y1", function(d) { return d.source.y; }) 
      .attr("x2", function(d) { return d.target.x; }) 
      .attr("y2", function(d) { return d.target.y; }); 

      Ynode.attr("cx", function(d) { return d.x; }) 
      .attr("cy", function(d) { return d.y; }); 
      }); 

// Start 'er up 
forceY.start(); 
} 
+0

Tôi đang cố gắng làm điều tương tự như bạn: đồng bộ hóa vị trí nút của hai bố trí lực trên cùng một trang. Tôi có hai bố trí lực lượng hoạt động nhờ vào câu trả lời của Alex Reynolds. Tuy nhiên, tôi không nhận được nơi để thiết lập các móc cho đồng bộ vị trí.Kể từ khi các liên kết đến cách tiếp cận của DBLaremore không hoạt động nữa, có bất cứ ai một gợi ý nơi để bắt đầu hoặc có thể liên kết đến một ví dụ khác? – tty56

Trả lời

4

Tôi đã viết một công cụ cho phép duyệt qua sinh học regulatory networks, hiển thị hai bảng SVG cạnh nhau. Mỗi bảng chứa một mạng bố trí lực, như được vẽ bởi API d3.js.

Tôi thấy rằng chìa khóa để thực hiện công việc này là cung cấp cho mọi phần tử trong DOM một tên duy nhất, nơi có thể có sự trùng lặp.

Trong trường hợp của tôi, tôi đã sử dụng _left_right làm đủ cho mọi phần tử bảng điều khiển, trong đó phần tử nằm trong bảng điều khiển bên trái hoặc bên phải, tương ứng. Có rất nhiều công việc để theo dõi, nhưng trình kết xuất mạng có thể nhắm mục tiêu các cuộc gọi và sự kiện của nó đến đúng phần tử và mạng.

Trong trường hợp của bạn:

.attr("id", function(d,i) { 
     return ("idx" + i); 
     }) 

Bạn muốn thay thế giá trị return với một cái gì đó độc đáo địa chỉ mạng mà nút được liên kết với. Cho dù bạn sử dụng lược đồ đánh số chỉ mục hoặc phương pháp dựa trên hậu tố, như tôi đã làm, mẹo là đảm bảo tất cả các tên id là duy nhất.

+0

Ví dụ về trang web của bạn là một ví dụ tốt để bắt chước — trông tuyệt vời! Tuy nhiên, tôi không thể khắc phục sự cố của mình bằng cách thay đổi id. Tôi đã thử sử dụng các id khác nhau, cũng như không có id và trong cả hai trường hợp, màn hình vẫn đang cập nhật lẫn nhau. Tôi đã kiểm tra rằng tên cho trái (X) và phải (Y) khác nhau về tên của bố trí, nút, liên kết, và vải canvas svg. Bất cứ một đề nghị nào khác? Tôi không biết nếu điều này là có liên quan, nhưng nếu bạn kéo và giữ một mạng cho đủ dài, người kia sẽ làm mát/đóng băng và sau đó không còn được liên kết (rõ ràng). – DBLarremore

+0

Tôi không biết những gì khác sẽ làm việc. Tôi biết rằng đảm bảo mọi yếu tố duy nhất trong mỗi mạng là duy nhất là chìa khóa để thực hiện công việc này. Nếu có bất kỳ tên 'id' trùng lặp nào, mọi thứ sẽ bị hỏng. Ước gì tôi có thể giúp đỡ nhiều hơn! –

+0

Một điều khác tôi đã nhận thấy rằng (có lẽ) cung cấp một đầu mối: Sau một số lượng thời gian/tản, bố cục sẽ đóng băng các nút ở vị trí hiện tại của chúng. Nếu bạn lấy bố trí bên trái và di chuyển nó xung quanh cho đến khi đóng băng phải, bạn sẽ không thể di chuyển bố trí bên phải gián tiếp nữa. Sau đó, nếu bạn lấy bố cục phù hợp, bạn có thể sử dụng nó để ảnh hưởng đến ** chỉ ** bên trái cho đến khi đóng băng bên trái. Đối với tôi, điều này ngụ ý rằng trong khi vị trí của bố trí có thể bị ảnh hưởng, bộ hẹn giờ làm mát không bị ảnh hưởng bởi chuyển động đó. Các nút di chuyển trong cả hai ô, nhưng chỉ có một đăng ký động lực. – DBLarremore

0

Javascript nổi tiếng vì làm ảnh hưởng đến việc nhà nước có được chia sẻ hay không. Ví dụ tối thiểu của bạn không còn nữa, nhưng khi tôi gặp phải vấn đề tương tự, kết luận của tôi là tôi chỉ tạo ra những bản sao nông mà tôi cần những bản sao hoàn chỉnh. (Tôi đang nói về các liên kết và nút mà D3 lấy làm đầu vào.)

Nếu không có bản sao thực, hành vi kết quả sẽ là một chút ngẫu nhiên, tùy thuộc vào việc mã D3 có thay đổi bất kỳ dữ liệu được chia sẻ nào không "tại chỗ" hay không. Nói chung, D3 cố gắng không phải để tạo bản sao vì lý do hiệu suất.

Đây là lý do tại sao giải pháp cuộc gọi json hoạt động: bằng cách hoàn toàn xâu chuỗi tất cả dữ liệu, bạn đang thực tế buộc một thao tác sao chép.

Các vấn đề liên quan