首页
学习
活动
专区
圈层
工具
发布

D3重绘刷
EN

Stack Overflow用户
提问于 2013-04-25 03:05:27
回答 2查看 4.9K关注 0票数 2

我有一个问题已经好几个星期没能解决了。我正在处理这个示例的修改版本:http://bl.ocks.org/mbostock/1667367,我最初定义了画笔,所以它的画笔范围在0.5到0.8之间。

代码语言:javascript
复制
var brush = d3.svg.brush()
    .x(x2)
    .extent([0.5, 0.8])
    .on("brush", brushed);

笔刷选择显示在正确的位置(在上下文图上),但焦点区域的初始视图仍然设置为整个数据集的范围(而不是画笔的剪裁区域)。我读过定义画笔并不会自动强制对区域进行重绘,但我似乎不知道如何使焦点区域的视图自动缩放到画笔范围。有人能提供一些关于这方面的投入吗?

更新1 I当前有一个名为的函数,它执行以下操作:

代码语言:javascript
复制
function brushed() {
  x.domain(brush.empty() ? x2.domain() : brush.extent());
  focus.select("path").attr("d", Light_area);
  focus.select(".x.axis").call(xAxis);
  Light_line_overlay.select("path").attr("d", Light_area);

  rules.select(".y.grid").call(make_x_axis_light()
          .tickSize(-height, 0, 0)
          .tickFormat("")
      );

  var xx0=brush.x()(brush.extent()[0]);
  var xx1=brush.x()(brush.extent()[1]);

  brushfill.attr("x", xx0);
  brushfill.attr("width", xx1-xx0);
}

这和这个例子有点不同..。因为我一直在修改它以完成与基本示例不同的事情。然而,第一条评论建议我应该在声明画笔之后调用这个刷函数(参见第一篇文章)。但是,调用此函数不会做任何事情(或者至少不会将焦点区域更新到画笔的范围)。你有什么意见建议?

EN

回答 2

Stack Overflow用户

发布于 2015-06-04 13:36:40

我很抱歉这么晚了两年才回答这个问题,但我只是遇到了同样的情况,这是我在这个话题上找到的唯一资源。我想出了办法,所以希望这能帮助其他无意中发现的人。

最初问题中的代码几乎一直都在那里,只是在范围初始化上没有正确的扩展。

我使用的数据是一个具有ts键的对象数组(这是一个划时代的毫秒),用于我的x值。

代码语言:javascript
复制
// These are needed for the brush construction to know how to scale
x2.domain(x.domain());
y2.domain(y.domain());

// Pick out the ~50% and ~80% marks from the data
var N = data.length;
var cx0 = new Date(data[Math.floor(N*0.50)].ts);
var cx1 = new Date(data[Math.floor(N*0.80)].ts);

// Construct with that extent, which will leave the
// context box started in the correct position.
var brush = d3.svg.brush()
                  .x(x2)
                  .extent([cx0, cx1])
                  .on("brush", brushed)
;

// This is just the original brushed example 
function brushed() {
    x.domain(brush.empty() ? x2.domain() : brush.extent());
    focus.select(".area").attr("d", line);
    focus.select(".x.axis").call(xAxis);
}

...

var focus = svg.append("g")
               .attr("class", "focus")
               .attr("transform",
                     "translate(" + margin.left + "," + margin.top + ")")
;

// Now that focus is defined we can manually update it
brushed();

实际上,我在设置结束时一直调用brushed,只是为了保持美观,但这里的要点只是为了说明,一旦定义了focus,您就可以调用brushed执行您想要的任何更新。

最终,你的主要问题似乎是得到正确的范围类型。使用[0.5, 0.8]进行初始化,但是如果您在调用brushed时使用鼠标滑动焦点,那么brush.extent()将是[Date(), Date()]。这是有道理的,因为我们要把这个范围传递给x.domain。因此,这将在初始化刷子之前设置所有的缩放,这样初始化范围就可以是一个Date,那么其他的事情就都很麻烦了。

票数 1
EN

Stack Overflow用户

发布于 2013-04-25 03:38:06

当以编程方式更改画笔范围时,您需要执行类似于刷过函数的操作。调整x.domain大小,刷新视图。

代码语言:javascript
复制
function brushed() {
  x.domain(brush.empty() ? x2.domain() : brush.extent());
  focus.select("path").attr("d", area);
  focus.select(".x.axis").call(xAxis);
}

如果这不能解决您的问题,请考虑提供一些代码示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16205687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档