【问题标题】:How to use d3.js to visualize a JSON tree graph?如何使用 d3.js 可视化 JSON 树图?
【发布时间】:2018-09-06 15:43:35
【问题描述】:

tl;博士

  • 如何使Radial Tidy Tree 使用来自networkxnode_link_data(G[, attrs])tree_data(G, root[, attrs]) 的JSON 树数据?

  • 如何使D3 Cluster Dendrogram 使用来自networkxnode_link_data(G[, attrs])tree_data(G, root[, attrs]) 的JSON 树数据?

  • 如何使D3 Tidy Tree 使用来自networkxnode_link_data(G[, attrs])tree_data(G, root[, attrs]) 的JSON 树数据?

示例不使用 JSON 格式,而是使用 CSV 样式的输入。

长版

嗨,

我正在使用 Python 和 networkx 来生成图形数据(主要是树状的)。我可以使用their page 中提到的 networkx 函数将数据导出为 JSON:

  • node_link_data(G[, attrs]) : 返回节点链接格式的数据,适合 JSON 序列化和在 Javascript 文档中使用。
  • adjacency_data(G[, attrs]) : 以适合JSON序列化和Javascript文档使用的邻接格式返回数据。
  • tree_data(G, root[, attrs]) : 以树格式返回数据,适合 JSON 序列化并在 Javascript 文档中使用。

networkx 的文档明确提到:

类似于 d3.js 示例中的树 https://bl.ocks.org/mbostock/4063550

但是,linked example 似乎没有使用 JSON 树格式,而是使用了csv type of input。由于我的 javascript-skillz 基本上为零,我不明白如何使 Mike Bostock 的示例与我拥有的 JSON 数据一起工作。你能帮忙吗?

JSON 示例

{
  "issueid": "3295658",
  "issuetype": "Portfolio-Epic",
  "status": "In Progress",
  "pirank": 24,
  "id": "ATROB-2523",
  "children": [
    {
      "issueid": "3288189",
      "issuetype": "Epic",
      "status": "Implementation",
      "id": "ATTDATA-233",
      "children": [
        {
          "issueid": "3305730",
          "issuetype": "Task",
          "status": "Implementation",
          "id": "ATTDATA-363"
        },
        {
          "issueid": "3305723",
          "issuetype": "Task",
          "status": "Open",
          "id": "ATTDATA-361"
        },
        {
          "issueid": "3301728",
          "issuetype": "Task",
          "status": "Open",
          "id": "ATTDATA-336"
        },
        {
          "issueid": "3297381",
          "issuetype": "Task",
          "status": "Closed",
          "id": "ATTDATA-300"
        },
        {
          "issueid": "3295913",
          "issuetype": "Task",
          "status": "Review",
          "id": "ATTDATA-290"
        },
        {
          "issueid": "3295893",
          "issuetype": "Task",
          "status": "Open",
          "id": "ATTDATA-289"
        },
        {
          "issueid": "3291658",
          "issuetype": "Task",
          "status": "Closed",
          "id": "ATTDATA-256"
        },
        {
          "issueid": "3291653",
          "issuetype": "Task",
          "status": "Closed",
          "id": "ATTDATA-255"
        },
        {
          "issueid": "3291530",
          "issuetype": "Task",
          "status": "Open",
          "id": "ATTDATA-253"
        },
        {
          "issueid": "3290232",
          "issuetype": "Task",
          "status": "Open",
          "id": "ATTDATA-247"
        },
        {
          "issueid": "3287061",
          "issuetype": "Task",
          "status": "Resolved",
          "id": "ATTDATA-226"
        }
      ]
    },
    {
      "issueid": "3300899",
      "issuetype": "Request",
      "status": "REJECTED",
      "id": "ATI-1478"
    }
  ]
}

【问题讨论】:

  • 你能分享一个简单树(比如 3-8 个节点)的示例输出 json 吗?
  • 如果你的 Python 技能不错,那么在 mozilla 网站上快速阅读如何用 Javascript 进行操作将不是问题。
  • @rioV8 : 抱歉,我两周前才(重新)开始学习 python.... :/ 你能添加一个链接到我可以开始阅读的地方吗?谢谢:)

标签: javascript json d3.js networkx


【解决方案1】:

Mike Bostock 的链接示例使用 d3.stratify 将 CSV 数据转换为分层形式:

var stratify = d3.stratify()
    .parentId(function(d) { return d.id.substring(0, d.id.lastIndexOf(".")); });

[... later in the code...]


var root = tree(stratify(root));

在您的情况下,您的数据已经是分层形式,因此您可以通过 d3.hierarchy 运行它以将其转换为 d3 类型的层次结构,然后使用它创建图表:

var root = tree(d3.hierarchy(data));

您还需要将提取数据的函数从 d3.csv 更改为 d3.json

// assume your data is in `data.json`
d3.json("data.json", function(error, data) {

所以脚本的顶部现在看起来像这样:

<script type="text/javascript">

var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height"),
    g = svg.append("g").attr("transform", "translate(" + (width / 2 + 40) + "," + (height / 2 + 90) + ")");

var tree = d3.tree()
    .size([2 * Math.PI, 300])
    .separation(function(a, b) { return (a.parent == b.parent ? 1 : 2) / a.depth; });

d3.json("data.json", function(error, data) {
  if (error) throw error;

  var root = tree(d3.hierarchy(data));

Here's a .block 与您在上面提供的 JSON 数据中的树。

【讨论】:

  • 谢谢,@i-alarmed-alien。这个答案直接帮助我解决了我的问题(尽管我已经分心了几个月......)感谢您的发帖,尤其是在 .block 展示实现的情况下!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多