D3.js 平移/缩放顺序比例?
我使用d3渲染简化的甘特图,使用d3.behavior.zoom进行平移和缩放 x刻度是一个时间刻度(稍微修改为在列中居中日历日等),工作得很好,但我在决定如何缩放/平移y刻度时遇到了问题,y刻度的范围是一个任务列表,通常太多而无法在图表区域中显示,因此需要平移/缩放 有没有办法告诉默认顺序比例对缩放/平移事件作出反应,或者我应该编写自定义比例?如果我需要编写一个自定义的比例,那么最好是基于d3.scale.ordinal(让它存储整个任务列表,并且只使用可见子集作为其域),还是基于d3.scale.linear(然后实现类似于RangeBand等的顺序比例)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.scale.ordinal基本相同,只是它存储域值的完整范围,并实现设置可见域值范围的slice([min,max])方法
- 在缩放事件回调中跟踪y平移增量,并将其添加到存储y平移总量的变量中
- 检查总平移量是否>=大于两个范围值之间的y增量,如果是,检查我们是否已经在一个(可见或不可见)域边界(0或长度)上,如果我们没有将切片索引增加或减少1,则重置总平移变量,然后重新绘制轴
// 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愚蠢的编辑窗口提交评论,只要我按下回车键。。。。无论如何,只需注册笔刷处理程序函数,并在其中检查笔刷范围值,它们将告诉您在主图表中显示什么。