2012-06-18 9 views
33

多数D3の例を以下の間、データは通常flare.jsonに与えられた形式でフォーマットされに:D3のJSON形式に変換するには?

{ 
"name": "flare", 
"children": [ 
    { 
    "name": "analytics", 
    "children": [ 
    { 
    "name": "cluster", 
    "children": [ 
     {"name": "AgglomerativeCluster", "size": 3938}, 
     : 

次のように私は、隣接リストを持っている:

私は上記の形式に変換したい
A1 A2 
A2 A3 
A2 A4 

を。現在、私はサーバー側でこれをやっていますが、d3の機能を使ってこれを実現する方法はありますか?私はhereという1つを見つけましたが、このアプローチでは、保守性のために賛成できないd3コアライブラリの修正が必要なようです。助言がありますか?

+1

あなたは "隣接リスト" 何を意味するのですか? – jbabey

+1

彼は '[(A1、A2)、(A2、A3)、(A2、A4)]'を意味すると思いますか? – sczizzo

+0

@sczizzo:はい、それは私が意味するものです!申し訳ありません。私はより明確にすべきだった。 – Legend

答えて

51

何の所定のフォーマットはありません多くの場合、さまざまなアクセサ関数(hierarchy.childrenなど)とarray.mapなどを使用してデータを再定義することができます。しかし、引用符で囲まれた形式はおそらく、デフォルトのアクセサで動作するため、ツリーの最も便利な表現になります。

最初の質問は、graphまたはtreeを表示するかどうかです。グラフの場合、データ構造はnodeslinksで定義されます。ツリーの場合、レイアウトへの入力はルートノードであり、配列はchild nodesで、リーフノードにはvalueが関連付けられています。

グラフを表示したい場合は、すべてエッジのリストである必要があります。ノードの配列とリンクの配列を作成するには、エッジを繰り返してください。あなたは、これらのノードを渡すことができ

d3.csv("graph.csv", function(links) { 
    var nodesByName = {}; 

    // Create nodes for each unique source and target. 
    links.forEach(function(link) { 
    link.source = nodeByName(link.source); 
    link.target = nodeByName(link.target); 
    }); 

    // Extract the array of nodes from the map by name. 
    var nodes = d3.values(nodeByName); 

    function nodeByName(name) { 
    return nodesByName[name] || (nodesByName[name] = {name: name}); 
    } 
}); 

と:あなたはd3.csvを使用してこのファイルをロードして、ノードとリンクの配列を作り出すことができる

source,target 
A1,A2 
A2,A3 
A2,A4 

:あなたは「graph.csv」と呼ばれるファイルを持っていたと言いますグラフを可視化する力のレイアウトへのリンク:

ツリーを代わりに作成する場合は、少しずつ異なる形式のデータ変換を行い、各親の子ノードを累積する必要があります。そのよう

d3.csv("graph.csv", function(links) { 
    var nodesByName = {}; 

    // Create nodes for each unique source and target. 
    links.forEach(function(link) { 
    var parent = link.source = nodeByName(link.source), 
     child = link.target = nodeByName(link.target); 
    if (parent.children) parent.children.push(child); 
    else parent.children = [child]; 
    }); 

    // Extract the root node. 
    var root = links[0].source; 

    function nodeByName(name) { 
    return nodesByName[name] || (nodesByName[name] = {name: name}); 
    } 
}); 

+0

+1お時間を頂き、詳細な説明をしていただきありがとうございます。それは私が持っていた誤解のいくつかをクリアします。 – Legend

+0

このアプローチの一環としてd3のネスト機能を使用して、csvを別のツリー構造に変換することを検討してください。https://github.com/mbostock/d3/wiki/Arrays#-nest – PhoebeB

4

D3は特定の形式を必要としません。それはあなたのアプリケーションによって異なります。隣接リストを確かにflare.jsonで使用されているフォーマットに変換できますが、これもアプリケーション固有のコードになります。一般に、ツリーを構築するために必要な「ヘッド」や「ルート」要素がないため、隣接リストとしてはできません。さらに、サイクル、孤児などを個別に処理する必要があります。あなたが現在サーバー側で変換をやっていることを、私は「それが壊れていない場合は、それを修正していない」と言うように誘惑されると思い考える

;)

関連する問題