admin管理员组文章数量:1398334
What I want to create is a zoomable, brushable timeline in D3 version 3.5.6. For now I'm not using D3's zoom behavior but just two zoom buttons. My problem is the following: When a button is clicked, I update the scale and redraw the axis as well as the brush. For some reason the brush doesn't update the extent rectangle and the handles but just the background. I know that I'm not actually updating the .extent()
of the brush. But isn't the brush supposed to update when the scale was changed?
Here's the relevant portion of the code. The rest can be found in this fiddle.
document.getElementById('in').addEventListener('click', zoom.bind(null, .1));
document.getElementById('out').addEventListener('click', zoom.bind(null, -.1));
function zoom(step) {
var offset;
zoomScale += step;
if(zoomScale < 1)
zoomScale -= step;
offset = (zoomScale * width - width) / 2;
// updating the scale
xScale
.range([-offset, width + offset]);
// redrawing the brush which doesn't seem to have effect I expected
brushGroup
.call(brush);
// redrawing the axis which works fine
xAxisGroup
.transition()
.call(xAxis);
}
Thanks a lot!
What I want to create is a zoomable, brushable timeline in D3 version 3.5.6. For now I'm not using D3's zoom behavior but just two zoom buttons. My problem is the following: When a button is clicked, I update the scale and redraw the axis as well as the brush. For some reason the brush doesn't update the extent rectangle and the handles but just the background. I know that I'm not actually updating the .extent()
of the brush. But isn't the brush supposed to update when the scale was changed?
Here's the relevant portion of the code. The rest can be found in this fiddle.
document.getElementById('in').addEventListener('click', zoom.bind(null, .1));
document.getElementById('out').addEventListener('click', zoom.bind(null, -.1));
function zoom(step) {
var offset;
zoomScale += step;
if(zoomScale < 1)
zoomScale -= step;
offset = (zoomScale * width - width) / 2;
// updating the scale
xScale
.range([-offset, width + offset]);
// redrawing the brush which doesn't seem to have effect I expected
brushGroup
.call(brush);
// redrawing the axis which works fine
xAxisGroup
.transition()
.call(xAxis);
}
Thanks a lot!
Share Improve this question edited Jun 28, 2018 at 9:21 lambda 3,3831 gold badge28 silver badges32 bronze badges asked Sep 22, 2015 at 15:07 FlavioFlavio 1,5975 gold badges20 silver badges30 bronze badges3 Answers
Reset to default 6Apparently you need to reset the brush's extent, so the internal xExtent
and yExtent
variables are reset. Seems like a bug to me.
brush.extent(brush.extent());
https://jsfiddle/azksfjjw/6/
I caught the problem in your zoom function you re define xScale range as
xScale
.range([-offset, width + offset]);
After this you need to pass it here
brush = d3.svg.brush()
.x(xScale) // This need new Values
.extent([.1, .6]),
Than after you can call to re draw your time line
brushGroup
.call(brush);
here the fiddle https://jsfiddle/azksfjjw/4/
I had the same problem, and fixed it by deleting the brush group and calling it again.
Before graph resizing:
var brush = d3.brushX().extent([[0, 0], [graph_dim.w, graph_dim.h]]).on("end", brushended);
graphContent.append("g").attr("class", "brush").call(brush);
After graph resizing:
// update graph height
graph_dim.h = my_new_graph_height;
// update brush extent
brush.extent([[0, 0], [graph_dim.w, graph_dim.h]]);
graphDIV.select(".brush").remove();
graphContent.append("g").attr("class", "brush").call(brush);
Probably not the best way, but it works :-)
NOTE that if you have mouse events on the same graph, they will no longer be accessible (the brush will "cover" them) -- see this answer.
本文标签: javascriptD3 updating brush39s scale doesn39t update brushStack Overflow
版权声明:本文标题:javascript - D3 updating brush's scale doesn't update brush - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744117901a2591599.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论