【问题标题】:Pan/zoom ordinal scale?平移/缩放序数比例?
【发布时间】:2012-10-31 18:49:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: d3.js zooming scale pan


    【解决方案1】:

    与我之前的回答相比略有扩展,因为有人私下联系我解释我是如何做到这一点的。

    首先,相关应用的屏幕截图,其主要工作是汇总和显示从各种来源(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();
    }
    

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

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

    我希望这能解决问题。

    【讨论】:

      【解决方案2】:

      事实证明这并不难,我不得不:

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

      【讨论】:

      • 你需要做的是使用画笔控件。 MB 的 bl.ocks.org 网站上有一些示例。就像这个bl.ocks.org/mbostock/1667367呸,愚蠢的编辑窗​​口在我按下回车后立即提交评论....无论如何,只需注册您的画笔处理函数,并在其中检查画笔范围值,他们会告诉您要显示的内容你的主图表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2015-08-08
      • 2013-12-12
      • 2016-03-10
      相关资源
      最近更新 更多