D3.js 平移/缩放顺序比例?

D3.js 平移/缩放顺序比例?,d3.js,zooming,scale,pan,D3.js,Zooming,Scale,Pan,我使用d3渲染简化的甘特图,使用d3.behavior.zoom进行平移和缩放 x刻度是一个时间刻度(稍微修改为在列中居中日历日等),工作得很好,但我在决定如何缩放/平移y刻度时遇到了问题,y刻度的范围是一个任务列表,通常太多而无法在图表区域中显示,因此需要平移/缩放 有没有办法告诉默认顺序比例对缩放/平移事件作出反应,或者我应该编写自定义比例?如果我需要编写一个自定义的比例,那么最好是基于d3.scale.ordinal(让它存储整个任务列表,并且只使用可见子集作为其域),还是基于d3.sca

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

x刻度是一个时间刻度(稍微修改为在列中居中日历日等),工作得很好,但我在决定如何缩放/平移y刻度时遇到了问题,y刻度的范围是一个任务列表,通常太多而无法在图表区域中显示,因此需要平移/缩放

有没有办法告诉默认顺序比例对缩放/平移事件作出反应,或者我应该编写自定义比例?如果我需要编写一个自定义的比例,那么最好是基于d3.scale.ordinal(让它存储整个任务列表,并且只使用可见子集作为其域),还是基于d3.scale.linear(然后实现类似于RangeBand等的顺序比例)


或者我遗漏了什么(很可能是因为这是我第一个使用d3的项目)?

结果证明这并不难,我必须:

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

与我之前的回答略有不同,因为有人私下联系我,向我解释我是如何做到这一点的

首先,这是一个有问题的应用程序的屏幕截图,谁的emain job正在聚合和显示从各种来源(PowerPoint文件、公司数据库等)收集的计划数据

相关位是带有彩色点的右垂直轴,其中每个点代表项目的工作和涉及的组织。轴上的灰色区域是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();
}
处理程序内部发生的事情非常简单:

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

我希望这会让它变得清晰。

您需要做的是使用笔刷控件。MB的bl.ocks.org网站上有几个例子。像这样一个Bah愚蠢的编辑窗口提交评论,只要我按下回车键。。。。无论如何,只需注册笔刷处理程序函数,并在其中检查笔刷范围值,它们将告诉您在主图表中显示什么。