2013-05-30 34 views
6

cập nhật biểu đồ pie dụ trên trang web bl.ocks không cập nhật các yếu tố 'tại chỗ':Có thể tạo biểu đồ hình tròn với tính nhất quán của đối tượng không?

http://bl.ocks.org/j0hnsmith/5591116

function change() { 
    clearTimeout(timeout); 
    path = path.data(pie(dataset[this.value])); // update the data 
    // set the start and end angles to Math.PI * 2 so we can transition 
    // anticlockwise to the actual values later 
    path.enter().append("path") 
     .attr("fill", function (d, i) { 
     return color(i); 
     }) 
     .attr("d", arc(enterAntiClockwise)) 
     .each(function (d) { 
     this._current = { 
      data: d.data, 
      value: d.value, 
      startAngle: enterAntiClockwise.startAngle, 
      endAngle: enterAntiClockwise.endAngle 
     }; 
     }); // store the initial values 

    path.exit() 
     .transition() 
     .duration(750) 
     .attrTween('d', arcTweenOut) 
     .remove() // now remove the exiting arcs 

    path.transition().duration(750).attrTween("d", arcTween); // redraw the arcs 
} 

Thay vào đó, nó chỉ xử lý các mảng mới có giá trị như thương hiệu dữ liệu mới và thay đổi kích thước biểu đồ cho phù hợp.

Tôi đã tạo một fiddle chứng minh vấn đề này rất đơn giản:

http://jsfiddle.net/u9GBq/23/

Nếu bạn bấm 'thêm', nó thêm một int ngẫu nhiên để mảng: công trình này như dự định.

Nếu bạn nhấn 'xóa', yếu tố duy nhất bị chuyển ra ngoài luôn là yếu tố cuối cùng đã nhập vào chiếc bánh. Tóm lại, nó hoạt động giống như một ngăn xếp LIFO. Hành vi dự kiến ​​là dành cho vòng cung tròn có liên quan để được chuyển đổi thay thế.

Có thể áp dụng tính nhất quán của đối tượng cho bánh nướng không? Tôi cũng đã thử thêm một chức năng quan trọng (không được chứng minh trên fiddle) nhưng điều đó chỉ phá vỡ (kỳ quặc đủ nó hoạt động tốt với các đồ thị xếp chồng lên nhau của tôi).

Cảm ơn bạn.

+0

bạn có thể cung cấp một ví dụ đồ họa về những gì bạn có nghĩa là - những gì bạn sẽ mong đợi để xem trước và sau khi thêm một yếu tố mới? Nó không rõ ràng với tôi - một chiếc bánh cơ bản đại diện cho 100% của một tập hợp dữ liệu. Khi bạn thêm một phần tử mới vào biểu đồ hình tròn, tất cả các phần tử khác phải giảm tương ứng và ngược lại cũng đúng. – mccannf

+0

Xin chào mccannf, cảm ơn bạn đã lưu ý. Nếu bạn nhìn vào jsfiddle được liên kết thứ hai trong bài viết gốc của tôi, bạn có thể thấy rằng khi nhấn 'remove', bạn sẽ xóa một phần tử dữ liệu ngẫu nhiên cụ thể khỏi tập hợp. Tôi mong rằng vòng cung đặc biệt đó sẽ chuyển đổi. Thay vào đó, nó recolors tất cả các cung với màu sắc mới, và chuyển đổi ra một trong những cuối cùng mà nhập vào - không còn phản ánh các số liệu cơ bản. Vì lý do đó, có vẻ như d3 cũng không bảo toàn các chỉ số. –

+0

Ok, đã hiểu. Chẳng hạn như ví dụ này sẽ giúp: http://bl.ocks.org/mbostock/3888852. Ở đây mbostock đã gán một miền màu cho các tiêu đề dữ liệu và một chú thích được liên kết. – mccannf

Trả lời

11

Giải pháp dễ nhất cho vấn đề này là để giá trị còn thiếu thiết lập để không, chứ không phải là loại bỏ chúng hoàn toàn, như trong Part III của Pie Chart Update loạt các ví dụ. Sau đó, bạn nhận được object constancy miễn phí: bạn có cùng số lượng phần tử, theo cùng thứ tự, trên các cập nhật.

Ngoài ra, nếu bạn muốn có một dữ liệu tham gia như trong Part IV, bạn phải nói D3 nơi cung cách nhập nên nhập từ, và nơi cung thoát nên exit để. Một chiến lược hợp lý là tìm vòng cung lân cận gần nhất từ ​​dữ liệu ngược lại: đối với một vòng cung đã cho, tìm vòng cung lân cận gần nhất trong dữ liệu cũ (trước khi chuyển tiếp); tương tự như vậy đối với một vòng cung đã cho, tìm vòng cung lân cận gần nhất trong dữ liệu mới (sau chuyển tiếp).

Để tiếp tục ví dụ, giả sử bạn đang hiển thị doanh số bán táo ở các vùng khác nhau và muốn chuyển sang hiển thị cam. Bạn có thể sử dụng chức năng chính sau đây để duy trì đối tượng kiên trì:

function key(d) { 
    return d.data.region; 
} 

(Điều này giả định bạn đang sử dụng d3.layout.pie, bao bọc dữ liệu ban đầu của bạn và cho thấy nó như d.data.)

Bây giờ nói khi bạn chuyển sang cam, bạn có dữ liệu cũ sau và dữ liệu mới:

var data0 = path.data(), // retrieve the old data 
    data1 = pie(region.values); // compute the new data 

Đối với mỗi hồ quang vào lúc index i (nơi ddata1[i]), bạn có thể bước tuần tự thông qua trước dữ liệu trong data1, và xem nếu bạn có thể tìm thấy một trận đấu trong data0:

var m = data0.length; 
while (--i >= 0) { 
    var k = key(data1[i]); 
    for (var j = 0; j < m; ++j) { 
    if (key(data0[j]) === k) return data0[j]; // a match! 
    } 
} 

Nếu bạn tìm thấy một trận đấu, vòng cung cách nhập của bạn có thể bắt đầu từ các khớp arc của cuối một ngả. Nếu bạn không tìm thấy kết quả phù hợp trước đó, bạn có thể tìm kiếm một vòng kết hợp phù hợp để thay thế. Nếu không có kết quả phù hợp, thì không có sự chồng chéo giữa hai bộ dữ liệu, vì vậy bạn có thể nhập các cung tròn từ góc 0 ° hoặc thực hiện một crossfade. Bạn cũng có thể áp dụng kỹ thuật này để thoát khỏi vòng cung.

Đưa nó tất cả cùng nhau, đây là Part V:

pie chart update v

+0

Phần V, chỉ dành cho tôi :) Yeah !!!! Cảm ơn bạn rất nhiều Mike !!!!!!! –

0

Ok, tìm thấy giải pháp. Bí quyết là để vượt qua chính cách này:

path = path.data(pie(dataset), function (d) {return d.data}); // this is good 

như trái ngược với không đi qua nó, hoặc đi qua nó một cách sai lầm:

path = path.data(pie(dataset, function (d) {return d.data})); // this is bad 

Và đây là một fiddle cập nhật với một sự chuyển tiếp làm việc trên vòng cung phải! :)

http://jsfiddle.net/StephanTual/PA7WD/1/

+2

Đừng nghĩ điều đó đúng. Nếu hàm khóa của bạn là 'return d.data', thì tất cả các khóa của bạn sẽ là' "[object Object]" 'và những điều xấu sẽ xảy ra. Xin vui lòng xem câu trả lời của tôi, và tôi cũng khuyên bạn nên đọc [hướng dẫn constancy object] (http://bost.ocks.org/mike/constancy/) về các chức năng chính. – mbostock

+0

Chà, tôi được học chính bởi chính Mbostock, đó là một vinh dự! Cảm ơn Mike cho câu trả lời chi tiết dưới đây, tôi sẽ bỏ phiếu cho bạn. –

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