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可折叠树不同节点颜色 的相关文章

  • 如何使用 Fabric js 以编程方式自由绘制?

    使用 Fabric js 构建多人涂鸦 尝试使用 Fabric js 实现多人涂鸦 想法是当 U1 在画布上绘制时 我们将点推送到 RTDB 并在客户端上获取这些点 并以编程方式在两个客户端中绘制笔画 您可以将画布的数据保存在path cr
  • 为什么告诉 jQuery 单击我的链接按钮会减慢我的页面速度?

    不知道是不是更新面板的影响 https stackoverflow com questions 31359065 performance deteriorating after async postback scrolling become
  • 重新加载页面时保持计时器(setInterval)运行

    加载网页后 我会通过控制台插入一些 Javscript 我想知道我是否可以使用 Javascript 或 jQuery 重新加载页面 不是从缓存 同时保留我正在运行的 setInterval 我熟悉 location reload 但这会终
  • 使用 javascript 获取选择标签的名称

    我在任何地方都没有找到这个问题 所以我将其发布在这里 我有一堆选择标签 部分使用 VBScript 命名 我希望能够获取从 javascript 中的 onchange 事件调用的选择标签的名称 这是代码
  • Moment.js 在 Firefox 中返回 NaN,但在 Chrome 中不返回 NaN

    我有以下代码行 moment 11 10 2013 09 03 AM diff moment minutes 在 Chrome 30 0 1599 101 中 以下行返回一个数字 它每分钟都会更改 因此确切的值不相关 在 Firefox 2
  • 转义双引号 JavaScript

    我试图在 iPhone 上查看时运行某种图像格式 在其他情况下运行一些 Flash 视频 var uagent navigator userAgent toLowerCase if uagent search iphone gt 1 doc
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • 计算链接上的点击次数(不带 onclick)[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有诸如此类的链接 a href h
  • 将 javascript 变量作为 onsubmit href 链接传递到表单/输入字段

    id 喜欢有一个输入框 用户可以在其中输入搜索词 该搜索词可能会传递给一个 javascript 函数 然后该函数将一些 url 段与搜索词组合起来 创建一个完整的 url 到目前为止 它在没有表单的情况下工作正常 但我想向其中添加一个表单
  • 如何观察Firebase存储上传事件

    我有一个将照片上传到 Firebase 存储的 iOS 应用程序 以及一个连接到同一个 Firebase 的 Web 应用程序 有没有办法从网络上观察存储的变化 当上传照片时 只有iOS设备本身可以访问UploadTask 并且我没有看到o
  • parseInt() 和 Number() 有什么区别?

    How do parseInt https developer mozilla org en US docs Web JavaScript Reference Global Objects parseInt and Number https
  • d3 (v4) 树布局和打字稿:类型“HierarchyNode”上不存在属性“x”

    我正在尝试在使用时使用正确的 ts 类型d3 hierarchy具有树布局的根 例如 interface MyCustomGraphType id string children MyCustomGraphType let treeData
  • Cordova/Phonegap 通过 JavaScript 在应用程序浏览器中打印

    我想从我正在开发的 iPad 应用程序打印一页 或某些页面 应用程序启动时所做的第一件事是通过以下代码加载外部网站 window location https 我现在想从这个外部网站打印一些东西 在 iPad 上的 Safari 中效果很好
  • 可选链接不起作用:无法读取未定义的属性“0”[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 为什么可选链在这里不起作用 html userItemModel item priceList 0 sellerUrl
  • 根据用户投票移动 div

    我是新来的 但我喜欢这个网站 我检查了其他类似的问题 但没有看到我要找的东西 我是一名音乐家 有一段时间我一直在做 每日之歌 每天写一首小歌 我想将歌曲发布为 div 在里面 li 在 div 中 我只想要一个简单的 mp3 播放器和一个
  • 对于没有固定/相对/绝对位置的元素,是否有 z-index 替代方案?

    我需要在更高的位置显示一个元素 z level 问题是 该元素位于带有 a 的 div 内 display flex and justify content space around 正常的z index属性不起作用 我认为这是因为该元素没
  • 如何以编程方式移动 OpenLayers Vector?

    API 文档为OpenLayers Feature Vector http dev openlayers org apidocs files OpenLayers Feature Vector js html说 Vector 本身根本没有方
  • 是否包括触摸事件客户端X/Y 滚动?

    我正在尝试获取相对于的触摸坐标viewport来自触摸事件的浏览器 例如触摸启动 我尝试从 clientX Y 属性获取它们 但两者实际上都返回包括滚动在内的值 这是违反规范的 因为它说 clientX Y 应该返回坐标而不滚动 我尝试添加
  • 自定义 github 页面的预览图像

    是否可以自定义在将链接发布到 github 页面时看到的预览图像 我觉得他们专门解决了 github 存储库的问题here https docs github com en github administering a repository
  • 展平数组中的对象

    大家好 我从响应中获取了一系列对象 我需要将所有学生对象展平为简单的学生姓名 但不确定如何进行 任何帮助将不胜感激 数组示例 students id 123456 name Student Name active true students

随机推荐

  • 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 的节点应填充为绿色 我就是无法让它发挥作用 有人能帮助我吗 这是我的代码