Search code examples
javascriptarraysjsond3.jssunburst-diagram

How to convert my data into a format suitable for d3.js sunburst?


I have a data like this: https://jsfiddle.net/L79wjn0x/, and I would like to convert it in this format https://jsfiddle.net/49n1jmL5/. I am trying to make use of d3.nest method to change the format but unable to make it work. In my data children are linked with parent through parents'id.

Sample data I have is like below. Children are linked with parent through parent's id that is children's parent_id key is same that of parent's id key.

 [{
    "id": 1,
    "name": "ab",
    "parent_id": null,
    "value": 120,
    "tree_level": 1
  },
  {
    "id": 2,
    "name": "ac",
    "parent_id": null,
    "value": 110,
    "tree_level": 1
  } {
    "id": 3,
    "name": "abc",
    "parent_id": 1,
    "value": 30,
    "tree_level": 2
  },
  {
    "id": 4,
    "name": "abcd",
    "parent_id": 1,
    "value": 90,
    "tree_level": 2
  },
  {
    "id": 5,
    "name": "abc",
    "parent_id": 3,
    "value": 10,
    "tree_level": 3
  },
  {
    "id": 6,
    "name": "abc",
    "parent_id": 3,
    "value": 20,
    "tree_level": 3
  }
]

and i would like the above json format to be converted like below format. Can anyone lead me to the correct way

{
  "id": 1,
  "name": "ab",
  "parent_id": null,
  "value": 120,
  "tree_level": 1,
  children: [{
      "id": 3,
      "name": "abc",
      "parent_id": 1,
      "value": 30,
      "tree_level": 2
      children: [{
          "id": 5,
          "name": "abc",
          "parent_id": 3,
          "value": 10,
          "tree_level": 3
        },
        {
          "id": 6,
          "name": "abc",
          "parent_id": 3,
          "value": 20,
          "tree_level": 3
        }
      ]
    },
    {
      "id": 4,
      "name": "abcd",
      "parent_id": 1,
      "value": 90,
      "tree_level": 2,
      children: []
    }
  ]
}, {
  "id": 2,
  "name": "ac",
  "parent_id": null,
  "value": 110,
  "tree_level": 1,
  children: []
}

Below is the code which I wrote to convert but it doesn't work for me. It is not creating children inside, instead creating it outside.

var nested = d3.nest()
  .key(function(d) {
    if (d.parent_id === null)
      return d;
  }).rollup(function(ele) {
    return ele.map(function(c) {
      return {
        "id": c.id,
        "parent_id": c.parent_id,
        "name": c.name,
        "logValue": c.logValue,
        "tree_level": c.tree_level
      };
    });
  }).entries(this.dataset);
console.log(nested)

will d3.nest() work or i need something else ?


Solution

  • For passing that data to d3.partition(), which you'll use to create the sunburst, all you need is d3.stratify. In your case:

    const stratify = d3.stratify()
      .parentId(function(d) {
        return d.parent_id;
      });
    
    const hierarchicalData = stratify(data);
    

    Here is the demo (use your browser's console to see the object, not the S.O. snippet's one):

    const data = [{
        "id": 131567,
        "name": "cellular organisms",
        "tree_level": 1,
        "display_order": 2,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": null
      },
      {
        "id": 2759,
        "name": "Eukaryota",
        "tree_level": 2,
        "display_order": 5,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 131567
      },
      {
        "id": 33154,
        "name": "Opisthokonta",
        "tree_level": 3,
        "display_order": 49,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 2759
      }, {
        "id": 33208,
        "name": "Metazoa",
        "tree_level": 4,
        "display_order": 126,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 33154
      }, {
        "id": 6072,
        "name": "Eumetazoa",
        "tree_level": 5,
        "display_order": 227,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 33208
      }, {
        "id": 33213,
        "name": "Bilateria",
        "tree_level": 6,
        "display_order": 547,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 6072
      }, {
        "id": 33511,
        "name": "Deuterostomia",
        "tree_level": 7,
        "display_order": 950,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 33213
      }, {
        "id": 7711,
        "name": "Chordata",
        "tree_level": 8,
        "display_order": 1639,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 33511
      }, {
        "id": 89593,
        "name": "Craniata",
        "tree_level": 9,
        "display_order": 3042,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 7711
      }, {
        "id": 7742,
        "name": "Vertebrata",
        "tree_level": 10,
        "display_order": 3614,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 89593
      }, {
        "id": 7776,
        "name": "Gnathostomata",
        "tree_level": 11,
        "display_order": 4245,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 7742
      }, {
        "id": 117570,
        "name": "Teleostomi",
        "tree_level": 12,
        "display_order": 4684,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 7776
      }, {
        "id": 117571,
        "name": "Euteleostomi",
        "tree_level": 13,
        "display_order": 4994,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 117570
      }, {
        "id": 8287,
        "name": "Sarcopterygii",
        "tree_level": 14,
        "display_order": 5175,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 117571
      }, {
        "id": 1338369,
        "name": "Dipnotetrapodomorpha",
        "tree_level": 15,
        "display_order": 5787,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 8287
      }, {
        "id": 32523,
        "name": "Tetrapoda",
        "tree_level": 16,
        "display_order": 5945,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 1338369
      }, {
        "id": 32524,
        "name": "Amniota",
        "tree_level": 17,
        "display_order": 6322,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 32523
      }, {
        "id": 40674,
        "name": "Mammalia",
        "tree_level": 18,
        "display_order": 6556,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 32524
      }, {
        "id": 32525,
        "name": "Theria",
        "tree_level": 19,
        "display_order": 6705,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 40674
      }, {
        "id": 9347,
        "name": "Eutheria",
        "tree_level": 20,
        "display_order": 6882,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 32525
      }, {
        "id": 1437010,
        "name": "Boreoeutheria",
        "tree_level": 21,
        "display_order": 7254,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18314,
        "parent_id": 9347
      }, {
        "id": 314145,
        "name": "Laurasiatheria",
        "tree_level": 22,
        "display_order": 7469,
        "has_data": "N",
        "is_leaf": "N",
        "value": 48,
        "parent_id": 1437010
      }, {
        "id": 314146,
        "name": "Euarchontoglires",
        "tree_level": 22,
        "display_order": 7470,
        "has_data": "N",
        "is_leaf": "N",
        "value": 18281,
        "parent_id": 1437010
      }, {
        "id": 9443,
        "name": "Primates",
        "tree_level": 23,
        "display_order": 7575,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17686,
        "parent_id": 314146
      }, {
        "id": 33554,
        "name": "Carnivora",
        "tree_level": 23,
        "display_order": 7598,
        "has_data": "N",
        "is_leaf": "N",
        "value": 11,
        "parent_id": 314145
      }, {
        "id": 91561,
        "name": "Cetartiodactyla",
        "tree_level": 23,
        "display_order": 7629,
        "has_data": "N",
        "is_leaf": "N",
        "value": 37,
        "parent_id": 314145
      }, {
        "id": 314147,
        "name": "Glires",
        "tree_level": 23,
        "display_order": 7675,
        "has_data": "N",
        "is_leaf": "N",
        "value": 741,
        "parent_id": 314146
      }, {
        "id": 9845,
        "name": "Ruminantia",
        "tree_level": 24,
        "display_order": 7760,
        "has_data": "N",
        "is_leaf": "N",
        "value": 16,
        "parent_id": 91561
      }, {
        "id": 9989,
        "name": "Rodentia",
        "tree_level": 24,
        "display_order": 7762,
        "has_data": "N",
        "is_leaf": "N",
        "value": 741,
        "parent_id": 314147
      }, {
        "id": 35497,
        "name": "Suina",
        "tree_level": 24,
        "display_order": 7776,
        "has_data": "N",
        "is_leaf": "N",
        "value": 21,
        "parent_id": 91561
      }, {
        "id": 376913,
        "name": "Haplorrhini",
        "tree_level": 24,
        "display_order": 7857,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17686,
        "parent_id": 9443
      }, {
        "id": 379584,
        "name": "Caniformia",
        "tree_level": 24,
        "display_order": 7859,
        "has_data": "N",
        "is_leaf": "N",
        "value": 11,
        "parent_id": 33554
      }, {
        "id": 9655,
        "name": "Mustelidae",
        "tree_level": 25,
        "display_order": 7931,
        "has_data": "N",
        "is_leaf": "N",
        "value": 11,
        "parent_id": 379584
      }, {
        "id": 9821,
        "name": "Suidae",
        "tree_level": 25,
        "display_order": 7938,
        "has_data": "N",
        "is_leaf": "N",
        "value": 21,
        "parent_id": 35497
      }, {
        "id": 35500,
        "name": "Pecora",
        "tree_level": 25,
        "display_order": 7956,
        "has_data": "N",
        "is_leaf": "N",
        "value": 16,
        "parent_id": 9845
      }, {
        "id": 314293,
        "name": "Simiiformes",
        "tree_level": 25,
        "display_order": 8029,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17686,
        "parent_id": 376913
      }, {
        "id": 1963758,
        "name": "Myomorpha",
        "tree_level": 25,
        "display_order": 8054,
        "has_data": "N",
        "is_leaf": "N",
        "value": 741,
        "parent_id": 9989
      }, {
        "id": 9479,
        "name": "Platyrrhini",
        "tree_level": 26,
        "display_order": 8101,
        "has_data": "N",
        "is_leaf": "N",
        "value": 251,
        "parent_id": 314293
      }, {
        "id": 9526,
        "name": "Catarrhini",
        "tree_level": 26,
        "display_order": 8102,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17435,
        "parent_id": 314293
      }, {
        "id": 9822,
        "name": "Sus",
        "tree_level": 26,
        "display_order": 8108,
        "has_data": "N",
        "is_leaf": "N",
        "value": 21,
        "parent_id": 9821
      }, {
        "id": 9895,
        "name": "Bovidae",
        "tree_level": 26,
        "display_order": 8112,
        "has_data": "N",
        "is_leaf": "N",
        "value": 16,
        "parent_id": 35500
      }, {
        "id": 169418,
        "name": "Mustelinae",
        "tree_level": 26,
        "display_order": 8190,
        "has_data": "N",
        "is_leaf": "N",
        "value": 11,
        "parent_id": 9655
      }, {
        "id": 337687,
        "name": "Muroidea",
        "tree_level": 26,
        "display_order": 8202,
        "has_data": "N",
        "is_leaf": "N",
        "value": 741,
        "parent_id": 1963758
      }, {
        "id": 9665,
        "name": "Mustela",
        "tree_level": 27,
        "display_order": 8256,
        "has_data": "N",
        "is_leaf": "N",
        "value": 11,
        "parent_id": 169418
      }, {
        "id": 9823,
        "name": "Sus scrofa",
        "tree_level": 27,
        "display_order": 8261,
        "has_data": "N",
        "is_leaf": "N",
        "value": 21,
        "parent_id": 9822
      }, {
        "id": 10066,
        "name": "Muridae",
        "tree_level": 27,
        "display_order": 8267,
        "has_data": "N",
        "is_leaf": "N",
        "value": 741,
        "parent_id": 337687
      }, {
        "id": 27592,
        "name": "Bovinae",
        "tree_level": 27,
        "display_order": 8277,
        "has_data": "N",
        "is_leaf": "N",
        "value": 16,
        "parent_id": 9895
      }, {
        "id": 314295,
        "name": "Hominoidea",
        "tree_level": 27,
        "display_order": 8339,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17435,
        "parent_id": 9526
      }, {
        "id": 9604,
        "name": "Hominidae",
        "tree_level": 28,
        "display_order": 8386,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17435,
        "parent_id": 314295
      }, {
        "id": 9668,
        "name": "Mustela putorius",
        "tree_level": 28,
        "display_order": 8389,
        "has_data": "N",
        "is_leaf": "N",
        "value": 11,
        "parent_id": 9665
      }, {
        "id": 9903,
        "name": "Bos",
        "tree_level": 28,
        "display_order": 8395,
        "has_data": "N",
        "is_leaf": "N",
        "value": 16,
        "parent_id": 27592
      }, {
        "id": 39107,
        "name": "Murinae",
        "tree_level": 28,
        "display_order": 8420,
        "has_data": "N",
        "is_leaf": "N",
        "value": 741,
        "parent_id": 10066
      }, {
        "id": 9669,
        "name": "Mustela putorius furo",
        "tree_level": 29,
        "display_order": 8545,
        "has_data": "N",
        "is_leaf": "N",
        "value": 11,
        "parent_id": 9668
      }, {
        "id": 9913,
        "name": "Bos taurus",
        "tree_level": 29,
        "display_order": 8547,
        "has_data": "N",
        "is_leaf": "N",
        "value": 16,
        "parent_id": 9903
      }, {
        "id": 10088,
        "name": "Mus",
        "tree_level": 29,
        "display_order": 8556,
        "has_data": "N",
        "is_leaf": "N",
        "value": 3,
        "parent_id": 39107
      }, {
        "id": 10114,
        "name": "Rattus",
        "tree_level": 29,
        "display_order": 8557,
        "has_data": "N",
        "is_leaf": "N",
        "value": 740,
        "parent_id": 39107
      }, {
        "id": 207598,
        "name": "Homininae",
        "tree_level": 29,
        "display_order": 8606,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17435,
        "parent_id": 9604
      }, {
        "id": 9605,
        "name": "Homo",
        "tree_level": 30,
        "display_order": 8684,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17435,
        "parent_id": 207598
      }, {
        "id": 9606,
        "name": "Homo sapiens",
        "tree_level": 31,
        "display_order": 8808,
        "has_data": "N",
        "is_leaf": "N",
        "value": 17435,
        "parent_id": 9605
      }
    ];
    
    const stratify = d3.stratify()
      .parentId(function(d) {
        return d.parent_id;
      });
    
    const hierarchicalData = stratify(data);
    
    console.log(hierarchicalData)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>