だから私はd3のズームサークルを使用しています( http://mbostock.github.com/d3/talk/20111116/pack-hierarchy.html ):
データは、いくつかの異なるレベルの配列とオブジェクトを持つ json 配列として d3 スクリプトに渡されます。
object = {
class: "show",
name: "Game of Thrones",
children : [
{
class: "family",
name: "Starks",
children: [
{
class: "members",
name: "Rob"
},
{
class: "members",
name: "Jon Snow"
}
],
},
{
class: "family",
name: "Lannisters"
children: [
{
class: "members",
name: "Ser Jaime"
},
{
class: "members",
name: "Cersei"
}
],
}
],
}
円の表示に問題はありませんでした。現在、データの階層をマップする側にナビゲーション表示を作成しようとしています。理想的には、私が望むのは次のようなものだけです:
<ul>
<li> Game of Thrones
<ul>
<li> Starks
<ul>
<li> Rob </li>
<li> Jon Snow </li>
</ul>
</li>
<li> Lannisters
<ul>
<li> Ser Jaime </li>
<li> Cersei </li>
</ul>
</li>
</ul>
</li>
</ul>
基本的なリスト構造です。私ができることは、データの 1 レベル下にアクセスすることだけです。「div」を使用して、最初に構造をダウンさせようとしました。
var sentimentData = data.children;
var navBox = d3.select("body").append("body:div");
navBox
.attr("class", "navBox");
var sentimentNav = navBox.selectAll('div')
.data(sentimentData)
.enter()
.append('div')
.text(function(d){ return d.name; });
それ以上のレベルに進むことはできませんでした。再帰的な方法がおそらく最良の方法だと思っていました。以下でこの関数を試しましたが、親ノードではなく、一番上の div に div を追加しただけです。
function buildNav(d) {
if (d.children) {
children = d.children;
d3.select('body').append('div')
.data(children)
.enter()
.append('div')
.attr("class", function(d) {return d.name; });
children.forEach(buildNav);
d._children = d.children;
d.children = null;
}
}
buildNav(data);
子を親に追加する方法、または複数レベル下のデータにアクセスする方法についての提案は大歓迎です。