d3.js Insert() 函数添加子元素 - 而不是兄弟元素

2024-04-16

看起来当我使用“插入”功能时,新元素总是作为子元素插入 - 而不是作为sibling.

我仍然不明白为什么会这样,因为插入函数实际上应该在指定元素之前插入一个新元素 - 而不是in将指定元素作为子元素。

基本上我试图在“文本”元素旁边创建一个“矩形”元素

目标是在 d3 桑基图中的文本后面添加背景颜色。

 // NODE TEXT
this.nodes
  .selectAll('text')
  .data(this.data.nodes)
  .join(
    (enter) =>
      enter
        .append('text')
        .text((d) => `${d.name + ': ' + d.value}`)
        .style('fill', '#000000')
        .attr('text-anchor', 'right')
        .attr('x', (d, i) => {
          return d.x0 + (d.x1 - d.x0) / 0.5;
        })
        .attr('y', (d, i) => {
          return d.y0 + (d.y1 - d.y0) / 2;
        })
        .attr('dy', '0.35em')
        .attr('transform', (d, i) => {
          const x = d.x0 + (d.x1 - d.x0) / 2;
          const y = d.y0 + (d.y1 - d.y0) / 2;
          return `rotate(0, ${x}, ${y})`;
        })
        .call(getTextBox)
        .insert('rect', 'text')
        .attr('width', function (d) {
          return d.bbox.width;
        })
        .attr('height', function (d) {
          return d.bbox.height;
        })
        .attr('x', function (d) {
          return d.bbox.x;
        })
        .attr('y', function (d) {
          return d.bbox.y;
        })
        .style('fill', 'grey'),
    (update) =>
      update
        .transition()
        .duration(1000)
        .ease(d3_easeQuadInOut)
        .attr('x', (d, i) => {
          return d.x0 + (d.x1 - d.x0) / 2;
        })
        .attr('y', (d, i) => {
          return d.y0 + (d.y1 - d.y0) / 2;
        })
        .attr('transform', (d, i) => {
          const x = d.x0 + (d.x1 - d.x0) / 2;
          const y = d.y0 + (d.y1 - d.y0) / 2;
          return `rotate(0, ${x}, ${y})`;
        })
  );


function getTextBox(selection) {
  selection.each(function (d) {
    d.bbox = this.getBBox();
  });
}

这是我的浏览器渲染的 HTML 元素的图片。

请注意,“rect”元素是文本的子元素,而不是所需的同级元素。


您所拥有的代码中的结果是预期的:它发生是因为insert调用作为父级的文本选择。

第一个简单的解决方案是打破链条,这样你就有了selection.append and a selection.insert。例如:

const svg = d3.select("svg"),
  data = d3.range(5).map(e => ({
    value: e
  }));

svg.selectAll(null)
  .data(data)
  .join(enter => {
    enter.append("text")
      .attr("x", 20)
      .attr("y", d => 20 + 30 * d.value)
      .text(d => `text #${d.value}`)
      .call(getTextBox);

    enter.insert("rect", "text")
      .attr('width', d => d.bbox.width)
      .attr('height', d => d.bbox.height)
      .attr('x', d => d.bbox.x)
      .attr('y', d => d.bbox.y)
      .style('fill', 'grey')

  })

function getTextBox(selection) {
  selection.each(function(d) {
    d.bbox = this.getBBox();
  });
}
<script src="https://d3js.org/d3.v7.min.js"></script>
<svg></svg>

然而,这个 SVG 将具有以下结构:

<rect></rect>
<rect></rect>
<rect></rect>
...
<text></text>
<text></text>
<text></text>
...

也就是说,如果您想要以下结构......

<rect></rect>
<text></text>
<rect></rect>
<text></text>
<rect></rect>
<text></text>
...

...你需要更详细一点insert。在此示例中,我通过 ID 获取相应的文本元素:

const svg = d3.select("svg"),
  data = d3.range(5).map(e => ({
    value: e
  }));

svg.selectAll(null)
  .data(data)
  .join(enter => {
    enter.append("text")
      .attr("id", d => `text${d.value}`)
      .attr("x", 20)
      .attr("y", d => 20 + 30 * d.value)
      .text(d => `text #${d.value}`)
      .call(getTextBox);

    enter.insert("rect", d => d3.select(`#text${d.value}`).node())
      .attr('width', d => d.bbox.width)
      .attr('height', d => d.bbox.height)
      .attr('x', d => d.bbox.x)
      .attr('y', d => d.bbox.y)
      .style('fill', 'grey')

  })

function getTextBox(selection) {
  selection.each(function(d) {
    d.bbox = this.getBBox();
  });
}
<script src="https://d3js.org/d3.v7.min.js"></script>
<svg></svg>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3.js Insert() 函数添加子元素 - 而不是兄弟元素 的相关文章

  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • 构建:找不到“节点”的类型定义文件

    VS 2015 社区版 在家 npm 3 10 Angular 2 我试图在 ASP Net MVC 5 应用程序中获取 Angular2 设置 我开始使用的模板使用旧版本的 Angular 因此我更新了包引用 当我构建时 列表中的第一个错
  • 无法实例化模块 [$injector:unpr] 未知提供程序:$routeProvider

    我从 AngularJS 升级时收到此错误1 0 7 to 1 2 0rc1 ngRoute 模块不再是核心的一部分angular js文件 如果您继续使用 routeProvider 那么您现在需要包括angular route js在你
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • 原生元素聚焦功能不起作用

    我试图通过单击按钮自动聚焦在输入元素上 请参阅打字稿 ViewChild envFilter envFilter ElementRef onFilterSelect this envFilter nativeElement focus 在
  • jQM / jquery-collagePlus 使用问题

    我正在使用 jQM 构建应用程序 并且尝试使用 jquery collagePlus http ed lea github io jquery collagePlus http ed lea github io jquery collage
  • 了解 JavaScript - 资源

    使用 StackOverflow 的微型 Digit Blog 功能进行描述here https stackoverflow com about 我想发布以下我刚刚看到的 我觉得很有趣的谷歌技术谈话视频 我一直在理解 javascript
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 在 React Navigation 中将 props 传递给自定义抽屉导航器

    在反应导航抽屉菜单中 我想显示用户名 John Doe 它处于我的主要组件的状态 Router 我怎样才能将自定义抽屉内容组件传递给它 额外信息 我从 AsyncStorage 中获取此名称 组件已挂载 这是我的代码 export defa
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • 使用日期字符串数组在引导日期选择器中设置禁用月份不起作用

    我有一个日期选择器 其配置如下 HTML div class input group date div
  • 如何在 ASP.NET MVC 3 的 Razor 视图中编码嵌入的 javascript?

    如何在以下上下文中正确编码 JavaScript 我的 JSON 对象中的值是由应用程序管理员设置的 因此我假设它们需要正确编码 对于 HTML 和 JavaScript 都是如此 我在用着System Web Script Seriali
  • 禁用特定 div 上的 Tab 键

    我有以下结构 div div Some content div div Some content div div 我想 禁用 div2 上的 tab 键 我的意思是按下 tab 键时 div2 的元素不会获得焦点 有没有简单的方法可以使用
  • 从 DirectionsRenderer 中获取折线或标记的事件

    我正在使用 DirectionsService 和路线方法来生成 DirectionsResult 我还使用 DirectionsRenderer 对象来显示结果 因为它非常易于使用 我在检测 Directions changed 事件时没
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • 将 RequireJS 与遗留代码结合使用

    我正在处理一个非常大的项目 该项目使用 包含带有脚本标记的 javascript 文件的旧版 JSP 页面 使用其他 javascript 模块而不使用 RequireJS 的骨干模型和视图 现在 我们希望开始将 RequireJS 与 j
  • 使用 JQuery 根据下拉列表选择的值显示/隐藏控件

    我正在尝试使用 JQuery 根据下拉菜单的选定索引显示 隐藏 div 标签 但它不起作用 任何帮助将不胜感激 Thanks
  • 从输入类型编号获取无效值

    我正在使用输入类型数字 当它无效时 我如何从中获取值 例如 使用类型编号并仅打印 e 这本身是无效的 我正在使用 React 但我认为这个问题非常普遍 onChange event console log event target valu
  • 无法使用 HTML 设置未定义 jQuery UI 自动完成的属性“_renderItem”

    我使用以下代码将 jQuery UI 自动完成项呈现为 HTML 这些项目在自动完成控件中正确呈现 但我不断收到此 JavaScript 错误并且无法移动过去 Firefox 无法转换 JavaScript 参数 Chrome 无法设置未定

随机推荐

  • 何时添加组件类与用户控件?

    我有一个总体想法 并且有一些明显的情况 但对我来说也有一些灰色区域 什么时候最好使用从组件扩展以及什么时候最好创建用户控件 这与我试图解决的特定工作问题有关 但具体问题并不重要 这个问题的一般答案对我来说就足够了 在 WPF 和 Windo
  • 链接器错误已定义

    我正在制作一个nodejs插件 我的 Visual Studio 项目中有 5 个文件 comm h cc node main cc util h cc 我将它与图书馆链接node lib node main cc有一个功能 v8 Hand
  • 如何将 SSL 证书添加到 Bluemix java Cloud Foundry 应用程序?

    我正在使用 Spring Boot Java JDK 1 8 Java MongoDB 驱动程序和 MongoDB 开发微服务 我已经在 Bluemix 上创建了 MongoDB 实例 并且正在从 Java 微服务连接到该实例 Bluemi
  • 根据可能不存在于所有值上的分隔符将 pandas 列分成两部分

    我的数据框的一列看起来像这样 application blah 3 14 xyz 5 2 abc 代表软件 版本 我正在努力实现这样的目标 application name ver blah 3 14 blah 3 14 xyz 5 2 x
  • FormBorderStyle为NONE时的表单高度问题

    我有一个无边框表单 FormBorderStyle None 高度为23像素 在设计器中设置 当 NET 在运行时绘制我的表单时 它会绘制它38像素高 由于某种原因它增加了标题栏的高度 MessageBox Show this Height
  • 如何从意图中获取额外的日期?

    我正在打包一个意图 我添加的附加项之一是日期对象 如下所示 intent putExtra DATE EXTRA t getDate 后来 当我阅读附加内容时 我尝试像这样获取日期 this date new Date intent get
  • 修改 Spark RDD foreach 内的集合

    我试图在迭代 RDD 的元素时向映射添加元素 我没有收到任何错误 但修改没有发生 直接添加或迭代其他集合一切正常 scala gt val myMap new collection mutable HashMap String String
  • 将数据库名称设置为 SQL 中的变量

    目前 我正在根据一些业务规则在一个数据库到另一个数据库之间进行一些数据迁移 我正在编写这个巨大的脚本 其中多次引用这两个数据库 问题是这种数据迁移目前正在开发中 在某些时候我将需要在生产中使用两个不同的数据库来完成它 而不是像这样直接引用数
  • 如何制作带有圆角的 tkinter 画布矩形?

    我想创建一个带圆角的矩形 我正在使用 tkinter 的画布 为托比亚斯的方法提供另一种方法确实是用一个多边形来实现 如果您担心优化 或者不必担心引用单个对象的标签系统 那么这将具有成为一个画布对象的优点 该代码有点长 但非常基本 因为它只
  • Android webview:像浏览器一样下载文件

    我正在开发一个 Android 应用程序 其 webview 指向另一个团队的动态网站 当我下载文件时 主要是动态重定向PDF 和 ZIP 我得到的只是下载文件夹中的一个文件 其中包含一些 HTML 代码 其中包含诸如 用户不允许读取该文件
  • [fn] 与 [(fn, u8)] 之间的 Rust 差异

    为什么会这样编译 fn main let xs 1 2 3 but 才不是 fn main let xs 1 1 2 2 3 3 编辑 要明确的是 问题不是为什么它不编译 It is 这两个之间有什么区别 第一个可以编译 但第二个却不能 第
  • GCC“人工”函数属性的用例

    我刚刚读到 GCC 函数属性artificial但不太明白描述 你能给我一些有用的例子吗 另一个答案没有错 但也许我可以解释得更好一些 想象一下这个函数foo c 带有行号 10 static inline int foo struct q
  • Google Guava:如何使用 ImmutableSortedMap.naturalOrder?

    我正在使用 Google Guava r08 和 JDK 1 6 0 23 我想创建一个ImmutableSortedMap使用构建器 我知道我可以像这样创建构建器 ImmutableSortedMap Builder
  • authlib OAuth 客户端与 Flask 应用程序一起使用的更好示例?

    我已经在我的 Flask 应用程序中使用了密码和代码授予流程 但这一切都感觉有点笨拙 我发现使用fetch token and update token在 oauth register 中处理令牌超时非常令人困惑 并且我没有找到错误处理的示
  • PagedList 和异步

    我在视图中使用 PagedList 但我的脚手架控制器是使用这种默认索引操作生成的 public async Task
  • 如何从jar文件访问资源文件[重复]

    这个问题在这里已经有答案了 我读过很多类似的帖子 但我找不到解决我的问题的方法 我需要验证和解析 xml 文件 针对 xsd 架构进行验证 问题是 在我的方法中 当我运行 mvn package 然后运行 jar 文件时 出现以下错误 ja
  • 无法在 Windows 10 上连接到 Jekyll 的 localhost:4000

    我正在尝试在 Windows 10 计算机上设置 Jekyll 但无法连接到由以下人员创建的网站 127 0 0 1 4000 jekyll serve or bundle exec jekyll serve 我已遵循 Julian Thi
  • 提高网络速度并连接到 Node.js 服务器时出现意外行为

    我有一个简单的 Node js 服务器 例如 var app require express var compression require compression app use compression app get function
  • 如何降级我在cmd上拥有的nuget版本?

    我错误地使用 nuget update self 在cmd上升级nuget 自动升级到V3 5 并且我想将其降级到旧版本 2 8 6 与当前生产版本相同 如何降级 卸载 nuget 然后安装旧版本 我搜索了降级 nuget 卸载 nuget
  • d3.js Insert() 函数添加子元素 - 而不是兄弟元素

    看起来当我使用 插入 功能时 新元素总是作为子元素插入 而不是作为sibling 我仍然不明白为什么会这样 因为插入函数实际上应该在指定元素之前插入一个新元素 而不是in将指定元素作为子元素 基本上我试图在 文本 元素旁边创建一个 矩形 元