D3 v4 调整缩放至中心

2024-02-21

有没有明显的d3 V4相当于V3d3.behavior.zoom()

.center([width / 2, height / 2]) syntax.

(我已经搜索过,大多数手动缩放的工作示例等都在 V3 中运行......并且 API 文档据我所知没有提及它。)

我正在尝试添加手动放大/缩小按钮,使用示例:

https://bl.ocks.org/mbostock/7ec977c95910dd026812 https://bl.ocks.org/mbostock/7ec977c95910dd026812作为基础,但使用 V4。

Edit

Harpal https://stackoverflow.com/users/490332/harpal给我看一个example https://embed.plnkr.co/kVw0rWMo728dmbm8EjuG/在 d3 v4 中工作,但我不知道如何将其应用到我的项目中。

所以这是我的脚本:

//-----------------------------------Variables ---------------------------------------------------------------------------
//Alto y ancho
var w = 500;
var h = 500;
var padding = 0;
var coundata= 0;
var maxx = 0.30
var minx = -0.30
var maxy = 6
var miny = -6

//-----------------------------------CREAR GRAFICO SCATTER ----------------------------------------------------------------
//Funciones de escala
var xScale = d3.scaleLinear()
  .domain([minx, maxx])
  .range([padding, h]);

var yScale = d3.scaleLinear()
  .domain([miny, maxy])
  .range([h, padding]);

var rScale = d3.scaleLinear()
  .domain([0,5])
  .range([2, 6]);

//Eje x
var xAxis = d3.axisBottom()
  .scale(xScale);;

//Eje y
var yAxis = d3.axisLeft()
  .scale(yScale);

//Crear el elemento svg
var svg = d3.select("#linegraph")
  .append("svg")
  .attr("width", w)
  .attr("height", h);

//Colores
grupo = svg.append("svg:g");

var c2 = grupo.append("rect")
  .attr("width", (w/2) - padding)
  .attr("height", (h/2)- padding)
  .attr("transform", "translate("+w/2+","+padding+")")
  .attr("fill", "rgba(0, 255, 0, 0.3)");

var c1 = grupo.append("rect")
  .attr("width", (w/2) - padding)
  .attr("height", (h/2)- padding)
  .attr("transform", "translate("+padding+","+padding+")")
  .attr("fill", "rgba(255, 255, 0, 0.3)");


var c3 = grupo.append("rect")
  .attr("width", (w/2) - padding)
  .attr("height", (h/2)- padding)
  .attr("transform", "translate("+padding+","+h/2+")")
  .attr("fill", "rgba(255, 0, 0, 0.3)");

var c4 = grupo.append("rect")
  .attr("width", (w/2) - padding)
  .attr("height", (h/2)- padding)
  .attr("transform", "translate("+w/2+","+h/2+")")
  .attr("fill", "rgba(255, 165, 0, 0.3)");


var g =svg.append("g");

//Añadimos el eje x
var gX = svg.append("g")
  .attr("class", "axis")
  .attr("transform", "translate(0," + (h/2) + ")")
  .call(xAxis);

//Añadimos el eje y
var gY = svg.append("g")
  .attr("class", "axis")
  .attr("transform", "translate(" + (w/2)  + ",0)")
  .call(yAxis);

nowData = []
var grupo2 = svg.append("svg:g");


//Creamos los puntos
var datos = grupo2.selectAll("circle")
  .data(nowData)
  .enter()
  .append("circle")
  .attr("cx", function(d) {
    return xScale(d[0]);
  })
  .attr("cy", function(d) {
    return yScale(d[1]);
  })
  .attr("r", function(d) {
    return 5;
  })
  .append("svg:title")
  .text(function(d) {return "Valor x: "+d[0] +"\n Valor y :"+d[1]; })

;
var grupoLineas = svg.append("svg:g");
//--------------------------------- ZOOM---------------------------------------------------------------------              
var zoom = d3.zoom()
  // Don’t allow the zoomed area to be bigger than the viewport.
  .scaleExtent([1, Infinity])
  .translateExtent([[0, 0], [w, h]])
  .extent([[0, 0], [w, h]])
  .on("zoom", zoomed);


grupo.style("transform-origin","50% 50% 0");
grupo2.style("transform-origin","50% 50% 0");
grupoLineas.style("transform-origin","50% 50% 0");
svg.style("transform-origin","50% 50% 0");
gX.style("transform-origin","50% 50% 0");
gY.style("transform-origin","50% 50% 0");

svg.call(zoom);
function zoomed() {
  svg.attr("transform", d3.event.transform);
  gX.call(xAxis.scale(d3.event.transform.rescaleX(xScale)));
  gY.call(yAxis.scale(d3.event.transform.rescaleY(yScale)));
  grupo2.attr("transform",d3.event.transform);
  grupoLineas.attr("transform",d3.event.transform);
  grupo.attr("transform",d3.event.transform);
}
function resetted() {
  svg.transition()
    .duration(750)
    .call(zoom.transform, d3.zoomIdentity);
}
d3.select("#zoom_in")
  .on("click",function(){
    zoom.scaleBy(svg, 2);
  })
d3.select("#zoom_out")
  .on("click",function(){
    zoom.scaleBy(svg, 0.5);
  })
//---------------------------------------Funcion mostrarDatos ----------------------------------------------------------            
function mostrarDatos(){
  nowData=[]
  grupo2.selectAll("circle")
    .data(nowData)
    .exit()
    .remove()
  if($("#eae").prop('checked') == true)
  {
    nowData.push(eaepunt1[coundata])
    grupo2.selectAll("circle")

  }

  if($("#arab").prop('checked') == true)
  {
    nowData.push(arabpunt1[coundata])

  }
  console.log(nowData)

  grupo2.selectAll("circle")
    .data(nowData)
    .enter()
    .append("circle")
    .attr("cx", function(d) {
      return xScale(d[0]);
    })
    .attr("cy", function(d) {
      return yScale(d[1]);
    })
    .attr("r", function(d) {
      return 5;
    })
    .append("svg:title")
    .text(function(d) {return "Valor x: "+d[0] +"\n Valor y :"+d[1]; })
  ;
}
$("#eae").change(function()
{
  mostrarDatos();
});

$("#arab").change(function()
{
  mostrarDatos()
});

我应用的是("transform-origin","50% 50% 0");但它不能正常工作


你可以做两件事

  • 首先,直接将缩放应用于中心:
var zoom = d3.zoom()
  // Don’t allow the zoomed area to be bigger than the viewport.
  .scaleExtent([1, Infinity])
  .translateExtent([[0, 0], [w, h]])
  .extent([[0, 0], [w, h]])
  .on("zoom", zoomed);

grupopadre.style("transform-origin", "50% 50% 0");
svg.call(zoom);
function zoomed() {
  grupopadre
    .style('transform', 'scale(' + d3.event.transform.k + ')');
}
  • 其次,缩小时使图形居中:
var zoom = d3.zoom()
  // Don’t allow the zoomed area to be bigger than the viewport.
  .scaleExtent([1, Infinity])
  .translateExtent([[0, 0], [w, h]])
  .extent([[0, 0], [w, h]])
  .on("zoom", zoomed);

grupopadre.style("transform-origin", "50% 50% 0");

svg.call(zoom);
function zoomed() {
  grupopadre.attr("transform",d3.event.transform);
}  

您需要创建一个包含所有 SVG 内容的组。

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

D3 v4 调整缩放至中心 的相关文章

  • Android 设备上的 PhoneGap 蓝牙插件

    我一直在尝试让 PhoneGap 工作的蓝牙插件 但我似乎不知道哪里出了问题 首先 我的测试设备是 Galaxy S3 GT 19305T 应用程序是使用PhoneGap CLI http docs phonegap com en 3 0
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比

随机推荐

  • 满足我需求的强制门户

    我正在为我的组织寻找强制门户 我看到很多这样的应用程序将允许用户在 a 输入凭据或 b 付款后通过 我正在寻找的东西有点不同 让我介绍一些有关我的系统的基础知识 我正在使用活动目录和内部 DNS 运行基于 Windows 的网络 我有一个内
  • jquery Flexslider 手动控件不起作用

    我正在尝试为 flexslider 插件实现手动控制 这是我的代码 div class container div class columns row div class flexslider ul class slides li styl
  • 从 Flask-sqlalchemy 中的连接查询读取

    成功连接两个数据库表后 我尝试通过寻址第一个表来读取第二个表中的数据 我正在致辞opinion topic name来自我的 jinja2 模板 但没有返回任何内容 如何从连接的查询中访问 Topic topic name 值 view m
  • 内联图像未从 GatsbyJS 中的 markdown 文件正文加载

    我正在尝试使用 gatsby remark images 在我的 markdown 文件中使用内联图像 不幸的是 该图像无法加载到我的本地主机上 我不知道这是否只是语法错误 或者我错过了一些重大的东西 这是config https gith
  • __iter__ 是如何工作的?

    尽管阅读了它 但我仍然不太明白如何 iter 作品 一个简单的解释是什么 我见过def iter self return self 我不知道这是如何工作的 也不知道这是如何工作的步骤 我可以简单地说 iter 在类上定义一个方法 该方法将返
  • JXTable 列排序在 1.0 和 1.6 之间发生变化

    自从我们更新到 JDK1 6 以来 我最近将应用程序中的 SwingX 库从版本 1 0 更新到了 1 6 2 我知道排序已更改为重新使用 JDK 1 6 中引入的一些核心 JDK 组件 但是 在版本 1 0 中 可以通过单击标题对列进行排
  • 为什么相同时间的 Unix 时间戳在不同时区不同

    Why 7 18 2013 11 33GMT 时区和我当地的时区 亚洲 加尔各答 是否不同 由于 Unix 时间戳是自纪元时间以来计算的刻度1 1 1970 00 00 00 GMT所以我知道纪元时间在不同时区的不同间隔发生 但仍然如此 经
  • 在 C++ 11 中创建动态二维矩阵的好方法

    我已经知道如何使用创建动态二维矩阵new并使用释放它delete 由于 C 11 具有许多新的内存功能 例如unique ptr array容器等 创建 2D 矩阵的一种好方法是什么 这样就不需要显式地使用释放矩阵delete操作员 最简单
  • Laravel 5 不从点 ENV 文件读取值

    我不知道这个问题是否相关 LARAVEL 5 仍处于开发阶段 在观看了有关 LARAVEL 5 新功能的 Laracast 视频之一后 我已经拉取了 LARAVEL 5 我迫不及待地等待它的正式发布 我命名了本地环境dot文件为 env l
  • 如果我在一个类中有多个测试并且前面的测试失败,我如何让它跳过或退出该类而不是测试其余的测试?

    我将 Python 与 Selenium 和 unittest 结合使用 我在一堂课中有四个测试 因为它们都是相关的单元测试 如果前面的测试失败 如何让它跳过下一个测试 我已经阅读了unittest的skip方法的所有文档 但没有一个正是我
  • 显示事件的典型 uml 图

    我有几个模块 他们通过事件相互交流 通常使用什么 UML 图来显示这一点 人们使用非 uml 图吗 有什么例子吗 我想你肯定想要一个顺序图 http en wikipedia org wiki Sequence diagram按顺序显示模块
  • Laravel Eloquent 截断数据类型 double

    Laravel 截断 double 类型的值 值 3 539363636363637 显示为3 5393636363636 我这样做 e Enrollment find 173 dd e gt value show 3 5393636363
  • Docker swarm:如何手动设置节点名称?

    有关我的环境的一些背景 我有 docker swarm 在 3 个 ubuntu 14 04 vagrant 盒子上运行 swarm master 在一台机器上运行 带有 consul 另外 2 台机器正在运行加入到 master 的 Sw
  • C# 数组列表的排列?

    我有一个 ArrayList myList 我正在尝试创建数组中值的所有排列的列表 示例 所有值都是字符串 myList 0 1 5 3 9 myList 1 2 3 myList 2 93 myList 的计数可以变化 因此它的长度事先未
  • 如何将Transaction对象转换为R中的Dataframe

    如何将 arules 包中的数据集 Groceries 转换为数据帧 class Groceries 1 transactions attr package 1 arules 您需要指定实际需要的内容 我没有看到as data frame
  • 尝试在空对象引用上调用虚拟方法“android.os.Looper android.content.Context.getMainLooper()”[重复]

    这个问题在这里已经有答案了 每当我尝试在手机或模拟器上打开应用程序时 我的 Log cat 都会收到此错误 为了让您概述我当前正在做的项目 它是一个记录连接到手机上接入点的设备数据的系统 可以通过屏幕上的按钮打开和关闭这些设备 我想归功于
  • 参数异常“已添加具有相同密钥的项目”

    我不断收到以下代码的错误 Dictionary
  • IntelliJ:让 GridLayout 工作

    我尝试在我的应用程序中使用 GridLayout 但它不起作用 我使用了这个教程 IntelliJ 和 android support v7 widget GridLayout https stackoverflow com questio
  • CMake:Visual Studio 15 2017 找不到 Visual Studio 的任何实例

    当我尝试安装 CMake 时出现错误 Visual Studio 15 2017 could not find any instance of Visual Studio 我使用的是 Windows 7 和 Visual Studio 20
  • D3 v4 调整缩放至中心

    有没有明显的d3 V4相当于V3d3 behavior zoom center width 2 height 2 syntax 我已经搜索过 大多数手动缩放的工作示例等都在 V3 中运行 并且 API 文档据我所知没有提及它 我正在尝试添加