Javascript D3更新笔刷';s标度不';t更新刷

Javascript D3更新笔刷';s标度不';t更新刷,javascript,d3.js,svg,data-visualization,Javascript,D3.js,Svg,Data Visualization,我想在D3版本3.5.6中创建一个可缩放、可刷的时间线。现在我不使用D3的缩放行为,只使用两个缩放按钮。我的问题如下:单击按钮时,我会更新比例并重新绘制轴和笔刷。出于某种原因,画笔不会更新扩展矩形和控制柄,而只更新背景。我知道我实际上并没有更新画笔的.extent()。但是画笔不是应该在比例改变时更新吗 下面是代码的相关部分。其余的可以在中找到 document.getElementById('in').addEventListener('click',zoom.bind(null,.1));

我想在D3版本3.5.6中创建一个可缩放、可刷的时间线。现在我不使用D3的缩放行为,只使用两个缩放按钮。我的问题如下:单击按钮时,我会更新比例并重新绘制轴和笔刷。出于某种原因,画笔不会更新扩展矩形和控制柄,而只更新背景。我知道我实际上并没有更新画笔的
.extent()
。但是画笔不是应该在比例改变时更新吗

下面是代码的相关部分。其余的可以在中找到

document.getElementById('in').addEventListener('click',zoom.bind(null,.1));
document.getElementById('out').addEventListener('click',zoom.bind(null,-.1));
功能缩放(步进){
var偏移;
zoomScale+=步长;
如果(缩放比例<1)
动物鳞片-=台阶;
偏移量=(缩放比例*宽度-宽度)/2;
//更新比额表
xScale
.范围([-偏移,宽度+偏移]);
//重新绘制画笔,这似乎没有达到我预期的效果
灌木群
.打电话(刷子);
//重新绘制工作正常的轴
Xaxis群
.transition()
.呼叫(xAxis);
}

非常感谢

我发现了缩放函数中的问题,您将xScale范围重新定义为

 xScale
    .range([-offset, width + offset]); 
在这之后,你需要把它传给这里

brush = d3.svg.brush()
          .x(xScale) // This need new Values 
          .extent([.1, .6]),
之后你可以打电话重新划出你的时间线

 brushGroup
        .call(brush);

在这里,小提琴显然需要重置画笔的范围,因此内部
xExtent
yExtent
变量被重置。对我来说好像是个虫子

brush.extent(brush.extent());

我也遇到了同样的问题,通过删除画笔组并再次调用来修复

调整图表大小之前:

var brush = d3.brushX().extent([[0, 0], [graph_dim.w, graph_dim.h]]).on("end", brushended);
graphContent.append("g").attr("class", "brush").call(brush);
// 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);
调整图形大小后:

var brush = d3.brushX().extent([[0, 0], [graph_dim.w, graph_dim.h]]).on("end", brushended);
graphContent.append("g").attr("class", "brush").call(brush);
// 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);
可能不是最好的方法,但它很有效:-)


请注意,如果在同一个图形上有鼠标事件,它们将不再可访问(画笔将“覆盖”它们)——请参阅。

是的,非常感谢您的回答!这似乎有效,但我有点困惑。画笔不应该保存传递给它的
.scale()
函数的刻度吗?据我所知,斧子也是如此。如果他们的体重发生变化,你唯一要做的就是再给他们打电话,不是吗?在这方面有什么不同吗?