2012-11-12 50 views
8

我使用d3渲染简化的甘特图,使用d3.behavior.zoom进行平移和缩放。 x规模是一个时间尺度(略微修改为在列中等日历日期等)并且可以很好地工作,但是我在决定如何缩放/平移y尺度时存在问题,其范围是任务列表这往往是太多,以适应图表区域,所以需要平移/缩放。平移/缩放序号?

有没有办法告诉默认的序号比例对缩放/平移事件做出反应,还是我应该写一个自定义比例?如果我需要编写自定义比例,最好根据d3.scale.ordinal(它存储整个任务列表,并仅使用可见子集作为其域)或d3.scale。线性(然后实现类似于距离带的序数标度等)。

还是有什么我失踪(完全可能,因为它是我的第一个项目使用d3)?

回答

3

从我以前的答案略微扩大,因为我已私下联系到解释我是如何做到的。

首先,应用程序的屏幕截图,主要工作是聚合并显示从各种来源(PowerPoint文件,企业数据库等)收集的计划数据。

screenshot

相关位是正确的纵轴与彩色圆点,每个圆点代表一个项目的努力和参与组织。轴上的灰色区域是d3.js画笔,可以进行平移/调整大小以实时更改图表/表格数据。

// the axis is a regular ordinal axis, with a brush 
y2 = d3.scale.ordinal(), 
brush = d3.svg.brush().y(y2).on('brush', brushReact), 
// [...] 
// brush event handler 
function brushReact() { 
    if (tasksSlice == null) 
     return; 
    var yrb = y2.rangeBand(), 
     extent = brush.extent(), 
     s0 = Math.round(extent[0]/yrb), 
     s1 = Math.round(extent[1]/yrb); 
    if (s0 == tasksSlice[0] && s1 == tasksSlice[1]) 
     return; 
    tasksSlice = [s0, s1]; 
    inner.refresh(); 
} 

的处理程序中,会发生什么是相当简单:

  • 拿到刷程度
  • 它移植到索引中我的数据阵列
  • 片我的数据阵列,并设置结果作为数据显示
  • 刷新图表和表

我希望这可以清除它。

2

原来这并不难,我只好:

  • 编写自定义的规模,几乎等于d3.scale.ordinal,只不过它存储的全方位域值,并实现了切片( [min,max])方法设置可见域值的范围
  • 跟踪缩放事件回调中的y转换增量,并将其添加到存储总计y转换的变量
  • 检查总转换量是> =比两个范围值之间的y增量,如果它是检查我们还没有在(可见或不可见)域之一上(0或长度),如果我们不增加或减少切片索引1,重置总转换变量,然后重画轴
+0

你能发表一个片段吗?谢谢! – Dan

+0

对于某些示例代码+1。 – Thomas

+0

举一个例子会很棒,谢谢! – Kristoffer