2012-03-12 19 views
20

Tôi muốn một đồ thị dòng như trong ví dụ này: http://mbostock.github.com/d3/ex/stream.htmlD3 Real-Time streamgraph (Graph Data Visualization)

enter image description here

nhưng tôi muốn dữ liệu thời gian thực vào từ cánh phải và có dữ liệu cũ rời khỏi bên trái, sao cho tôi luôn có cửa sổ 200 mẫu. Làm thế nào tôi có thể làm điều này sao cho tôi có sự chuyển tiếp thích hợp?

tôi đã cố gắng thay đổi các điểm dữ liệu trong mảng a và sau đó tái tạo một khu vực như vậy

data0 = d3.layout.stack()(a); 

nhưng hiệu ứng chuyển tiếp của tôi không làm cho nó trông giống như biểu đồ được trượt trên màn hình.

Xin cảm ơn trước.

Trả lời

33

Hãy thử this tutorial:

Khi thực hiện hiển thị thời gian thực của dữ liệu chuỗi thời gian, chúng ta thường sử dụng trục x để mã hóa thời gian như vị trí: theo thời gian, dữ liệu mới xuất phát ở cánh phải, và cũ dữ liệu trượt sang bên trái. Nếu bạn sử dụng built-in path interpolators, tuy nhiên, bạn có thể thấy một số hành vi đáng ngạc nhiên D3 của ...

Để loại bỏ lung, suy biến đổi chứ không phải là con đường. Điều này có ý nghĩa nếu bạn nghĩ biểu đồ là hình dung chức năng — giá trị của nó không thay đổi, chúng tôi chỉ hiển thị một phần khác của miền. Bằng cách trượt cửa sổ có thể nhìn thấy ở mức tương tự rằng dữ liệu mới đến, chúng tôi liên tục có thể hiển thị dữ liệu thời gian thực ...

+0

Cảm ơn! Tôi đã chạy qua hướng dẫn, nhưng tôi đã gặp rất nhiều rắc rối khi cố gắng ngoại suy điều đó với ví dụ về biểu đồ luồng. Cuối cùng tôi đã sử dụng dòng mã này để thay đổi nhiều đường dẫn của mình. vis.selectAll ("đường dẫn"). Dữ liệu (dữ liệu0) .attr ("d", khu vực) .attr ("chuyển đổi", null) .transition(). Duration (50) .ease ("tuyến tính"). attr ("transform", "translate (" + -10 + ")") mỗi ("end", function (d, i) {if (i == 0) transition();}); Tôi chỉ có thể gọi đệ quy chuyển đổi trên đường dẫn đầu tiên, nếu không thì toàn bộ biểu đồ sẽ thay đổi một lần cho mọi đường đi, và sau đó tôi có một sự bùng nổ của các cuộc gọi lại. Có cách nào tốt hơn để làm điều này? Cảm ơn! – klyngbaek

+0

Tôi đã đăng ví dụ của mình ở đây: http://lyngbaek.com/real-time-stream-graph.html mỗi lần "đường dẫn" dưới cùng bị sai lệch so với 'đầu', có thể bằng cách tôi thực hiện cuộc gọi chuyển tiếp đệ quy() của tôi. Tôi ngoại suy từ hướng dẫn của bạn và tạo một mảng dữ liệu riêng biệt cho các đường dẫn trên cùng và dưới cùng. Sau đó, cá nhân tôi đẩy một giá trị mới cho mỗi người trong số họ. Tôi phải sau đó recompute một d3.layout.stack mới() và vẽ lại nó. Sau đó tôi chuyển 2 mảng dữ liệu của mình và lặp lại. Đây có phải là phương pháp chính xác hay không, hoặc có cách nào tốt hơn để làm điều đó không. Cảm ơn bạn lần nữa! – klyngbaek

+0

Đó là hầu hết những gì tôi đang tìm kiếm với câu hỏi của tôi ở đây: http: // stackoverflow.com/questions/12764813/produce-a-live-graph-with-d3 Bạn khuyên bạn nên lấy dữ liệu từ máy chủ đến máy khách như thế nào? –

7

Dưới đây là một ví dụ đơn giản: http://jsfiddle.net/cqDA9/1/ Nó cho thấy một giải pháp khả thi để theo dõi và cập nhật khác nhau chuỗi dữ liệu.

var update = function() { 
    for (Name in chart.chartSeries) { 
     chart.chartSeries[Name] = Math.random() * 10; 
    } 
    for (Name in chart2.chartSeries) { 
     chart2.chartSeries[Name] = Math.random() * 10; 
    } 
    setTimeout(update, 1000); 
} 
setTimeout(update, 1000);