在 D3.js 中缩放或平移时限制域

2023-11-28

我实现了一个简单的 D3.js 折线图,可以缩放和平移。它基于 Stephen Bannasch 的优秀示例here.

我的数据域是 x 维度中的 [0, n]。

如何使用内置缩放行为(即使用鼠标滚轮事件)将缩放和平移限制到此域?

我想防止用户在下端平移超过 0 或在上端平移超过 n,例如,他们永远不能看到 x 轴上的负值,并且希望将缩放限制到同一窗口。

我发现的基于 Jason Davies 使用范围( [...],[...],[...] ) 的示例似乎不再适用于版本 2.9.1。不幸的是,缩放行为目前是少数未记录在其他出色的 API 文档中的功能之一。

欢迎任何指点。

PS. 我在 D3.js 邮件列表上发布了同样的问题,但没有得到回复:https://groups.google.com/d/topic/d3-js/w6LrHLF2CYc/discussion。对于交叉发布表示歉意。


遗憾的是,比尔发布的解决方案只成功了一半:虽然它确实抑制了平移,但如果应用缩放,它会导致图形扭曲。那么通常不可能返回到正确比例和定位的图表。

在以下版本中,即使滚动到边框,轴的比例也会保持不变。

一旦缩放达到 100%,缩放域就会重置为其原始位置。即使中间步骤返回轴的非法参数,这也能保证正确的定位。

虽然并不完美,但我希望这个脚本可以帮助某人,直到 d3(重新)实现此功能。

# x and y are the scales
# xAxis and yAxis are the axes
# graph is the graph you want attach the zoom to

x0 = x.copy()
y0 = y.copy()

successfulTranslate = [0, 0]

zoomer = d3.behavior.zoom()
  .scaleExtent([1,2])

onZoom = ->
  ev = d3.event # contains: .translate[x,y], .scale
  if ev.scale == 1.0
    x.domain x0.domain()
    y.domain y0.domain()
    successfulTranslate = [0, 0]
  else
    xTrans = x0.range().map( (xVal) -> (xVal-ev.translate[0]) / ev.scale ).map(x0.invert)
    yTrans = y0.range().map( (yVal) -> (yVal-ev.translate[1]) / ev.scale ).map(y0.invert)
    xTransOk = xTrans[0] >= x0.domain()[0] and xTrans[1] <= x0.domain()[1]
    yTransOk = yTrans[0] >= y0.domain()[0] and yTrans[1] <= y0.domain()[1]
    if xTransOk
      x.domain xTrans
      successfulTranslate[0] = ev.translate[0]
    if yTransOk
      y.domain yTrans
      successfulTranslate[1] = ev.translate[1]
  zoomer.translate successfulTranslate

graph.select('g.x.axis').call(xAxis)
graph.select('g.y.axis').call(yAxis)
drawBars()

zoomer.on('zoom', onZoom)

# ...
graph.call(zoomer)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 D3.js 中缩放或平移时限制域 的相关文章

  • 单值或常量值时在 x 轴上绘制的样条图 - highchart

    while using the older version of highchart 2 1 6 if a plot had only one value or a series of same values it would plot a
  • 如何使用 LinkedIn javascript sdk 检索包括所有字段的职位列表?

    我想要获取 LinkedIn 会员在其个人资料中输入的每个职位的 ID 头衔 摘要 开始日期 结束日期 当前状态和公司名称 我测试了一个查询休息控制台 https apigee com console linkedin我得到了想要的结果 查
  • 检查 DOM 元素是否为复选框

    如何检查给定的 DOM 元素是否为复选框 设想 我有一组文本框和复选框 其中的值是动态分配的 我没有办法识别 DOM 元素是复选框还是文本框 只使用普通的 javascript 你就可以做到 if el type el type check
  • ngModel.$parsers 忽略 ng-model 值末尾的空格

    我有这样的指令 directive noWhitespace parse function parse return restrict A require ngModel link function scope element attrs
  • 是否可以将反应组件导出为非反应项目中的函数

    有没有办法在非 React 项目中将 React 组件导出为函数并传入 props 作为函数的参数 我最近用 create react app 完成了一个 React 项目 现在我想将它用于其他非 React 项目 纯 Javascript
  • 为什么将数据存储为元素的属性存在风险?

    我一直在读同样的东西 直接在 DOM 元素上存储属性值是有风险的 因为可能会发生内存泄漏 但有人可以更详细地解释这些风险吗 按属性 我假设您指的是 DOM 元素上的属性 DOM 元素上的自定义属性安全吗
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • 引入 V8 后,Google Apps 脚本无法为其他用户完全执行

    我编写了一个脚本 得到了这里好心人的大力帮助 该脚本使用 Google Sheets 脚本复制 Google Drive 上的文件夹 和内容 它运行了很长一段时间 但后来我启用了 V8 引擎 现在已禁用 问题是 它仍然适用于我 也许还有其他
  • 使用 jQuery 仅从字符串末尾修剪空格

    我知道 jQuery trim 函数 但我需要的是一种仅从字符串末尾修剪空格的方法 而不是开头 So str this is a string 会成为 str this is a string 有什么建议么 Thanks 您可以使用正则表达
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • 元素中优先考虑 ngclick 而非 nghref

    tl dr 如何强制 Angular 只执行 ngclick 指令 a 元素而不清空 删除href 我的网站在某些元素上有一些自定义行为 模式打开 位置栏更新等 但对于 SEO 索引我also需要它成为一个 a 元素与href包含有效链接的
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • Postman - 如何计算 JSON 响应中特定对象的出现次数

    我是 JSON 和 Postman 的新手 我相信我正在尝试做一些非常简单的事情 我创建了一个 GET 请求 它将获得如下所示的 JSON 响应 在下面的例子中我想得到count响应中所有 IsArchived 属性 这些属性的数量因响应而
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • 错误:创建 React Native 项目版本 0.59.9 时找不到 template.config.js

    当我尝试创建 React Native 项目版本 0 59 9 时 出现以下错误 错误错误 无法在 react native 模板中找到 var folders zc h93bvpb573q24 5ynvgkn1wc0000gn T rnc
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • Serviceworker Bug event.respondWith

    我的 serviceworker 的逻辑是 当发生获取事件时 它首先获取包含一些布尔值 而不是 event request url 的端点 并根据我正在调用的值检查该值event respondWith 对于当前的获取事件 我正在提供来自缓
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • 是否可以使用 --process-isolation 选项调试 PhpUnit 测试?

    对于单元测试 class SampleTest extends PHPUnit Framework TestCase public function testBreakpoint a 18 在第 5 行设置断点 a 18 Xdebug v2
  • Rails 控制台默认环境

    在我的开发机器上 bundle exec rails console Loading development environment Rails 3 2 3 1 9 3p194 001 gt Rails env gt development
  • Django admin MySQL 慢 INNER JOIN

    我有一个带有 3 个外键字段的简单模型 class Car models Model wheel models ForeignKey Wheel related name wheels created models DateTimeFiel
  • Pig:使用外部模式文件加载数据文件

    我有一个数据文件和相应的架构文件存储在不同的位置 我想使用架构文件中的架构加载数据 我尝试使用 A LOAD
  • Google CDN 未对 jquery 进行 gzip 压缩

    如果我导航到这里 http ajax googleapis com ajax libs jquery 1 4 jquery min js 我使用 Firefox 3 6 3 下载了 70k 我可以确认它正在发送 Accept Encodin
  • 有什么方法可以用 python 将终端输出分配给变量吗?

    我需要通过 python 获取视频文件的持续时间作为更大脚本的一部分 我知道我可以使用 ffmpeg 来获取持续时间 但我需要能够将该输出保存为 python 中的变量 我认为这会起作用 但它给我的值为 0 cmd ffmpeg i s 2
  • jQuery 文本匹配

    我有一个带有文本的锚标记 我想检查给定的 var 是否与字符串完全匹配 这是可行的 但我想使用包含以外的东西 因为如果包含给定的字符串 它将匹配两个元素 我希望它完全匹配 有任何想法吗 function test submenu a con
  • 使用 JavaScript 设置自定义属性

    我正在使用 DynaTree https code google com p dynatree 但我遇到了一些问题 希望有人可以帮助 我在页面上显示树 如下所示 div ul li class folder Outputs ul li It
  • OpenGL - 如何绘制到多重采样帧缓冲区,然后将结果用作普通纹理?

    我正在开发一个小游戏开发库 该库的元素之一是 Canvas 屏幕外绘图区域 它是通过 OpenGL 帧缓冲区实现的 到目前为止 一切都很好 我生成一个纹理 将其附加到帧缓冲区 渲染它 然后使用帧缓冲区的纹理作为Texture2D 现在 我想
  • 在 Javascript 中将 Base64 数据转换并插入到 Canvas

    我得到一个代表 Base64 图像的数据缓冲区 我得到的数据 代表base64中的图像 部分数据 193 109 51 74 182 71 212 38 78 62 211 48 81 145 244 39 244 250 215 192
  • 如何允许本地主机外部访问

    如何允许 Angular2 本地主机之外的访问 我可以导航到localhost 3030 panel很容易 但当我写下我的IP时我无法导航 例如10 123 14 12 3030 panel 你能告诉我如何修复它吗 我没有使用npm 节点项
  • Objective-C 中无延迟播放音效

    我想在人们按下我的应用程序中的某些按钮时播放一些简单的声音效果 并且我尝试了几种方法 但我总是遇到延迟 使声音看起来不同步 我已按照教程进行操作here 所以我尝试了音频服务中的构建 但是有延迟 并且我尝试了 AVAudioPlayer 但
  • 如何注册Windows Phone 8?什么是 Windows Phone IP Over USB 传输 (IpOverUsbSvc)?

    我有一台 Windows Phone 8 正在尝试使用开发者帐户注册它 我使用的是Visual studio 2012附带的工具 Windows Phone开发者注册 但是当我尝试注册时 我收到一条消息 对于 Windows Phone8
  • Java - 正斜杠转义字符

    谁能告诉我如何在 Java 中使用正斜杠转义字符 我知道反斜杠是 但我尝试过 和 但没有成功 这是我的代码 public boolean checkDate String dateToCheck if dateToCheck matches
  • sizeof(int[1]) 是什么意思?

    我是 Linux 内核的新手 我正在阅读文件ioctl h 在那里我遇到了一个宏 IOC TYPECHECK t 看起来像这样 define IOC TYPECHECK t sizeof t sizeof t 1 sizeof t lt 1
  • 关于 C# 中常量小数字段的令人困惑的警告

    我正在尝试const修改器 同时探索大量的 C 教程 并放置了一堆const像这样的类中的修饰符而不在任何地方实际使用它们 class ConstTesting const decimal somedecimal 1 const int s
  • 无法初始化集群。请检查您的配置中的mapreduce.framework.name和相应的服务器地址-提交job2remoteClustr

    我最近将集群从 Apache Hadoop1 0 升级到 CDH4 4 0 我在另一台机器上有一个 weblogic 服务器 我通过 mapreduce 客户端将作业提交到这个远程集群 我仍然想使用 MR1 而不是 Yarn 我已经根据 C
  • 使用 advapi32.dll:LogonUserA() 模拟远程计算机的本地用户

    我需要能够在远程计算机上运行 RegLoadKey 并且可能我的计算机和远程计算机不在同一域中 如果是的话 下面的代码可以正常工作 我可以模拟在计算机上具有管理员权限的用户 否则 如果我们谈论本地用户 我发现我的计算机上必须有一个具有相同用
  • sliderInput 最大/最小文本标签

    我目前正在开发具有多个滑块输入的仪表板 是否可以用文本替换最大和最小标签 例如 我的 min 1 和 max 10 我想将比例保持在 1 到 10 之间 同时让滑块标签分别显示为 较早 和 较晚 Thanks 遗憾的是 简短的回答是否定的
  • 在 D3.js 中缩放或平移时限制域

    我实现了一个简单的 D3 js 折线图 可以缩放和平移 它基于 Stephen Bannasch 的优秀示例here 我的数据域是 x 维度中的 0 n 如何使用内置缩放行为 即使用鼠标滚轮事件 将缩放和平移限制到此域 我想防止用户在下端平