D3可折叠树不同节点颜色

2024-04-19

我在 d3.js 中有一个可折叠的树。我的目标是通过“类型”属性为节点着色。例如,类型=“str”的节点应填充为红色,而类型=“elem”的节点应填充为绿色。我就是无法让它发挥作用。有人能帮助我吗。

这是我的代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">

<title>Tree Collapsible Example</title>

<style>

    .node {
        cursor: pointer;
    }

    .node circle {
        fill: #fff;
        stroke: steelblue;
        stroke-width: 2px;
    }

    .node text {
        font: 10px sans-serif;
    }

    .link {
        fill: none;
        stroke: #ccc;
        stroke-width: 1.5px;
    }

</style>

</head>

<body>

<!-- load the d3.js library -->
<script src="http://d3js.org/d3.v3.min.js"></script>

<script>

// ************** Generate the tree diagram  *****************
var margin = {top: 20, right: 120, bottom: 20, left: 120},
        width = 1000 - margin.right - margin.left,
        height = 500 - margin.top - margin.bottom;

var i = 0,
        duration = 750,
        root;

var tree = d3.layout.tree()
        .size([height, width]);

var diagonal = d3.svg.diagonal()
        .projection(function(d) { return [d.y, d.x]; });

var svg = d3.select("body").append("svg")
        .attr("width", width + margin.right + margin.left)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

// load the external data
d3.json("dendrogram02.json", function(error, treeData) {
    root = treeData[0];
    root.x0 = height / 2;
    root.y0 = 0;
    update(root);
});

d3.select(self.frameElement).style("height", "500px");

function update(source) {

    // Compute the new tree layout.
    var nodes = tree.nodes(root).reverse(),
            links = tree.links(nodes);

    // Normalize for fixed-depth.
    nodes.forEach(function(d) { d.y = d.depth * 80; });

    // Update the nodes…
    var node = svg.selectAll("g.node")
            .data(nodes, function(d) { return d.id || (d.id = ++i); });

    // Enter any new nodes at the parent's previous position.
    var nodeEnter = node.enter().append("g")
            .attr("class", "node")
            .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
            .on("click", click);

    nodeEnter.append("circle")
            .attr("r", 1e-6)
            .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });

    nodeEnter.append("text")
            .attr("x", function(d) { return d.children || d._children ? 20 : 13; })
            .attr("dy", function(d) { return d.children || d._children ? "-.8em" : ".35em"; })
            .attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; })
            .text(function(d) { return d.name; })
            .style("fill-opacity", 1e-6);

    // Transition nodes to their new position.
    var nodeUpdate = node.transition()
            .duration(duration)
            .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; });

    nodeUpdate.select("circle")
            .attr("r", 4)
            .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });

    nodeUpdate.select("text")
            .style("fill-opacity", 1);

    // Transition exiting nodes to the parent's new position.
    var nodeExit = node.exit().transition()
            .duration(duration)
            .attr("transform", function(d) { return "translate(" + source.y + "," + source.x + ")"; })
            .remove();

    nodeExit.select("circle")
            .attr("r", 1e-6);

    nodeExit.select("text")
            .style("fill-opacity", 1e-6);

    // Update the links…
    var link = svg.selectAll("path.link")
            .data(links, function(d) { return d.target.id; });

    // Enter any new links at the parent's previous position.
    link.enter().insert("path", "g")
            .attr("class", "link")
            .attr("d", function(d) {
                var o = {x: source.x0, y: source.y0};
                return diagonal({source: o, target: o});
            });

    // Transition links to their new position.
    link.transition()
            .duration(duration)
            .attr("d", diagonal);

    // Transition exiting nodes to the parent's new position.
    link.exit().transition()
            .duration(duration)
            .attr("d", function(d) {
                var o = {x: source.x, y: source.y};
                return diagonal({source: o, target: o});
            })
            .remove();

    // Stash the old positions for transition.
    nodes.forEach(function(d) {
        d.x0 = d.x;
        d.y0 = d.y;
    });
}

// Toggle children on click.
function click(d) {
    if (d.children) {
        d._children = d.children;
        d.children = null;
    } else {
        d.children = d._children;
        d._children = null;
    }
    update(d);
}

</script>

</body>
</html>

以及对应的.json:

[
  {
    "name": "1",
    "type": "sources",
    "children": [
      {
        "name": "0",
        "type": "dfasdl",
        "children": [
          {
            "name": "companies",
            "type": "seq",
            "children": [
              {
                "name": "row",
                "type": "elem",
                "children": [
                  {
                    "name": "id",
                    "type": "str"
                  },
                  {
                    "name": "companyName",
                    "type": "str"
                  },
                  {
                    "name": "industry",
                    "type": "str"
                  },
                  {
                    "name": "telephoneCompany",
                    "type": "str"
                  },
                  {
                    "name": "date_entered",
                    "type": "datetime"
                  }
                ]
              }
            ]
          },
          {
            "name": "contacts",
            "type": "seq",
            "children": [
              {
                "name": "row",
                "type": "elem",
                "children": [
                  {
                    "name": "id",
                    "type": "str"
                  },
                  {
                    "name": "title",
                    "type": "str"
                  },
                  {
                    "name": "contactFirstName",
                    "type": "str"
                  },
                  {
                    "name": "contactLastName",
                    "type": "str"
                  },
                  {
                    "name": "telephoneUS",
                    "type": "str"
                  }
                ]
              }
            ]
          },
          {
            "name": "employees",
            "type": "seq",
            "children": [
              {
                "name": "row",
                "type": "elem",
                "children": [
                  {
                    "name": "id",
                    "type": "str"
                  },
                  {
                    "name": "position",
                    "type": "str"
                  },
                  {
                    "name": "employeeFirstName",
                    "type": "str"
                  },
                  {
                    "name": "employeeLastName",
                    "type": "str"
                  },
                  {
                    "name": "telephoneUS",
                    "type": "str"
                  }
                ]
              }
            ]
          },
          {
            "name": "vendors",
            "type": "seq",
            "children": [
              {
                "name": "row",
                "type": "elem",
                "children": [
                  {
                    "name": "id",
                    "type": "str"
                  },
                  {
                    "name": "type",
                    "type": "str"
                  },
                  {
                    "name": "vendorFirstName",
                    "type": "str"
                  },
                  {
                    "name": "vendorLastName",
                    "type": "str"
                  },
                  {
                    "name": "telephone",
                    "type": "str"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

您所需要做的就是修改

nodeEnter.append("circle")
        .attr("r", 1e-6)
        .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });

根据您的要求:

nodeEnter.append("circle")
        .attr("r", 1e-6)
        .style("fill", function(d) {
          if(d.type == "str") return "red";
          if(d.type == "elem") return "green";
        });

当您设置填充颜色两次时,您还必须对更新选择执行以下操作:

 nodeUpdate.select("circle")
        .attr("r", 4)
        .style("fill", function(d) {
          if(d.type == "str") return "red";
          if(d.type == "elem") return "green";
        });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3可折叠树不同节点颜色 的相关文章

  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 悬停此元素时隐藏元素后的伪元素

    我的菜单垂直放置在页面左侧和菜单之间 li 我有一个 after那是一个分隔符 我想要的是当我悬停元素本身 如果它是第一个元素 时隐藏 after 元素 或者当它是中间元素时隐藏上面和底部的元素 如果它是最后一个子元素 则隐藏 after前
  • Twitter 卡元标签问题

    有问题的网址 https www halleonard com viewpressreleasedetail action releaseid 10261 https www halleonard com viewpressreleased
  • 如何在codeigniter中将上传图片比例限制为16:9?

    这是我用来上传图像的代码 this gt load gt library upload ext pathinfo file name PATHINFO EXTENSION img name now ext imgConfig upload
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • HTML 锚点,禁用样式

    我有一些 html 锚链接代码 与文档的其余部分不同 我希望它看起来不是链接 有没有一种简单的方法可以禁用由于将文本包装在锚标记中而引起的样式更改 而不必强行使其相同 即 如果我更改正文字体样式 我不必也更改其他一些 link东西 将颜色设
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • Jquery - 选择选项后如何获取选项的特定数据类型?

    我将直接跳到标记 然后解释我想要做什么 HTML 选择选项
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev

随机推荐

  • C# 8 使用声明范围混乱

    使用新的 C 8 using 声明语法 第二个连续的 using 语句的包含范围是什么 TL DR 在 C 8 之前 有一个连续的 using 语句 例如 using var disposable new MemoryStream usin
  • jQuery $.extend 不覆盖目标属性

    是否可以扩展对象而不覆盖已设置的属性 在下面的示例中 我正在寻找一种方法为猫添加 2 个翅膀 但保留它的 4 条腿 var cat legs 4 var bird legs 2 wings 2 some references in my a
  • 如何更改多次提交的作者和提交者姓名/电子邮件?

    如何更改一系列提交的作者 注意 此答案会更改 SHA1 因此在已推送的分支上使用它时要小心 如果您只想修复名称的拼写或更新旧电子邮件 Git 可以让您无需使用重写历史记录即可完成此操作 mailmap See 我的另一个答案 https s
  • (以编程方式)比较 PDF 的可靠方法? [复制]

    这个问题在这里已经有答案了 可能的重复 比较大量 PDF 文件的工具 https stackoverflow com questions 145657 tool to compare large numbers of pdf files 我
  • 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?

    如何在两个 boost multi arrays 之间执行数学运算 添加两个值类型为 double 的数组的示例 auto array1 boost multi array
  • 使用 Fourseven:scss 在 Meteor 中加载 css

    我正在使用 fourseven scss 来编译 scss 文件 如果我包括我的 这似乎工作正常 scss客户端目录下的文件 不过我想把它们留在我的组件附近 imports ui stylesheets 或者就在组件旁边 imports u
  • 删除数组中的所有空间 javascript

    我有一个数组 需要从中删除空格 例如它返回如下 book row boat rain coat 但是 我想删除所有空白 我在网上看到的所有指南都说可以使用 replace 但似乎只适用于字符串 到目前为止 这是我的代码 function t
  • sqlalchemy mixin、外键和关系

    我在创建一个简单的 mixin 时遇到问题 我计划在一堆 sqlalchemy 声明类上使用它 基本想法是我想要一个创建 修改时间戳和一个创建 修改用户存储在多个表上 mixin 位于其自己的文件 global mixins py 中 并且
  • Task.Result 始终为 null

    我正在编写一些代码来通过 Task Factory FromAsync 在 WP7 应用程序中 执行 HttpRequest 任务的 Result 属性始终为 null 但我知道请求本身是正确的 因为如果我将其粘贴到浏览器或 Fiddler
  • 如何使用 html 5 跳转到视频位置

    我想使用 html5 video 标签来播放我的视频 如何设置视频开始播放的时间 例如我的视频长 90 秒 我想在 30 秒时开始播放
  • 程序崩溃并显示 0xC000000D 并且没有异常 - 如何调试它?

    我有一个使用第三方库的 Visual C 9 Win32 应用程序 当使用一组特定参数调用该库中的函数时 程序会崩溃并显示 异常代码 0xC000000D 我尝试附加 Visual Studio 调试器 没有抛出异常 C 也没有像访问冲突那
  • Java ExecutorService:awaitTermination所有递归创建的任务

    我用一个ExecutorService执行任务 该任务可以递归地创建提交给同一个任务的其他任务ExecutorService这些子任务也可以做到这一点 我现在遇到的问题是我想等到所有任务都完成 即所有任务都完成并且他们没有提交新任务 才继续
  • Xcode 将文件框中的 gpx 文件显示为灰色

    我希望我没有忽略任何事情 但我无法将 gpx 文件加载到 Xcode 中 因为它们在文件框中显示为灰色 见图 这在两个位置菜单中都有 在调试器 位置菜单中 参见下图 将 GPX 文件添加到项目 和 场景位置菜单 然而 预设 伦敦等 确实有效
  • 如何总结不同的groupby组合?

    我正在编制一份按县列出的前 3 名作物的表格 有些县的农作物品种相同 顺序相同 其他县也有相同的作物品种 但顺序不同 df1 pd DataFrame County Harney Baker Wheeler Hood River Wasco
  • 如何使用@types/express-session?

    当我写这个时 import Request from express serve static core router post req Request res next gt req session user user tsc给我一个错误
  • 在eclipse中安装了深色主题,但滚动条仍然是灰色的

    我在用日食月神 4 4 0 并试图让它完全黑暗 所以我安装了一个主题插件 Eclipse菜单 gt 帮助 gt Eclipse Marketplace 搜索 Eclipse Color Theme Plugin 在 Windows 首选项
  • 从 Windows 服务中的 OnStart 立即触发计时器_elapsed

    我正在使用一个System Timers Timer我的代码中有如下代码OnStartC Windows 服务中的方法 timer new Timer timer Elapsed timer Elapsed timer Enabled tr
  • 空的、不可编辑的 pg_hba.conf 文件

    我正在尝试使用本教程将我的 Sinatra 应用程序连接到 PostgreSQL 数据库 http samuelstern wordpress com 2012 11 28 making a simple database driven w
  • 不兼容的库版本:nokogiri.bundle 需要版本 11.0.0 或更高版本,但 libxml2.2.dylib

    当我尝试在 Hartl 的教程中运行 rspec 时 出现此错误 我用谷歌搜索了该错误 但它从来都不是针对特定版本的 而且修复程序实际上并不能解决我的问题 Users Jimbo rvm gems ruby 2 0 0 p247 gems
  • D3可折叠树不同节点颜色

    我在 d3 js 中有一个可折叠的树 我的目标是通过 类型 属性为节点着色 例如 类型 str 的节点应填充为红色 而类型 elem 的节点应填充为绿色 我就是无法让它发挥作用 有人能帮助我吗 这是我的代码