平移/缩放序数?

时间:2012-11-12 10:34:51

标签: d3.js zoom scale pan

我使用d3渲染简化的甘特图,使用d3.behavior.zoom进行平移和缩放。

x刻度是一个时间刻度(略微修改为以列为中心的日历天等)并且工作得很好,但我在确定如何缩放/平移y刻度时遇到问题,其域是一个任务列表通常太多而无法放入图表区域,因此需要进行平移/缩放。

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

或者是否有我遗漏的东西(完全可能因为它是我使用d3的第一个项目)?

2 个答案:

答案 0 :(得分: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();
}

处理程序内部发生的事情非常简单:

  • 获取画笔范围
  • 将其转置到我的数据数组中的索引
  • 切片我的数据数组并将结果设置为要显示的数据
  • 刷新图表和表格

我希望这可以解决它。

答案 1 :(得分:2)

原来并不难,我不得不:

  • 编写自定义比例,大多数与d3.scale.ordinal相同,只是它存储了所有域值并实现了一个设置可见域值范围的切片([min,max])方法
  • 跟踪缩放事件回调中的y转换增量,并将其添加到存储总y转换的变量
  • 检查总翻译量是否>> =两个范围值之间的y delta,如果检查我们是否已经在(可见或不可见)域边界之一(0或长度),如果我们不将切片索引递增或递减1,则重置总转换变量,然后重绘轴