Nó có thể được thực hiện nhưng với use of the D3 brush API (Xem lưu ý dưới đây).
Đây là một ví dụ http://bl.ocks.org/4747894 nơi:
- Yếu tố
brush
là đằng sau các vòng tròn
- Các vòng tròn đáp ứng với sự kiện
mousedown
. (Có thể trả lời các sự kiện khác.)
- Phần tử
brush
được xử lý tốt ngay cả khi kéo bắt đầu từ bên trong một trong các vòng kết nối.
Một số tracing và nhìn vào D3 source code gợi ý rằng extent
không được thiết lập lại đúng khi một sự kiện mousemove
được bắn từ một yếu tố circle
trên đỉnh bàn chải. Điều đó có thể được cố định bằng cách đặt lại extent
cho bàn chải trong mousedown
listener cho circle
yếu tố:
circles.on("mousedown", function (d, i) {
// _svg_ is the node on which the brush has been created
// x is the x-scale, y is the y-scale
var xy = d3.mouse(svg.node()),
xInv = x.invert(xy[0]),
yInv = y.invert(xy[1]);
// Reset brush's extent
brush.extent([[xInv, yInv], [xInv, yInv]]);
// Do other stuff which we wanted to do in this listener
});
Lưu ý:As per the API, lựa chọn của bàn chải sẽ không được làm mới tự động trên gọi .extent(values)
. Chỉ cần nhấp vào một vòng kết nối sẽ đặt lại số extent
nhưng sẽ không vẽ lại lựa chọn được thực hiện. Lựa chọn sẽ chỉ bị hủy khi một lựa chọn khác được bắt đầu bên trong circle
hoặc bằng cách nhấp vào bên ngoài vòng kết nối và lựa chọn hiện tại. Đây là hành vi mong muốn, như tôi đã hiểu từ câu hỏi. Tuy nhiên, điều này có thể phá vỡ mã được viết với giả định rằng bất cứ điều gì là extent
của bàn chải sẽ là lựa chọn hiển thị trên biểu đồ.
Nguồn
2013-02-10 02:38:29
Điều này rất gần. Lý tưởng nhất, tôi muốn có thể kéo bàn chải xung quanh sau khi nó được tạo ra, ngay cả khi tôi bắt đầu trên một vòng tròn, nhưng nó là một bước tiến lớn về cách nó làm việc ngay bây giờ! – RichH
Thật vậy, tôi thấy rằng việc kéo lựa chọn từ bên trong một '' vẫn không thể thực hiện được. Tôi sẽ suy nghĩ về làm thế nào để làm sạch nó, mặc dù tôi nghi ngờ rằng làm một sự kiện sạch sẽ đi qua sẽ liên quan đến một bản vá cho d3. –