1

D3コードダイアグラムがどのように機能するかを理解しようとしています. 私の最初のステップは、次のスクリプトを使用してダイアグラムの円弧を表示することです。しかし、何らかの理由で、アークが表示されません。

こちらのウェブページをご覧ください

誰かが私が欠けているものを教えてもらえますか?

    <body>
    <script>
        // Chart dimensions.
        var width = 960, 
                height = 750, 
                innerRadius = Math.min(width, height) * .41, 
                outerRadius = innerRadius * 1.1; 

  //Create SVG element with chart dementions
        var svg = d3. select("body")
                .append("svg")
                .attr("width", width) 
                .attr("height", height) 
                .append ("g")
                .attr("transform", "translate (" + width / 2 + "," + height / 2 + ")"); 

//------------Reformat Data ------------------------------------------

        var matrix = [];  // <- here is the data 
        d3.tsv('picData.tsv', function(err, data) 
        {
            //console.log(data);
            pictures = d3.keys(data[0]).slice(1);
            //console.log(pictures);

            data.forEach(function(row) 
            {
                var mrow = [];
                pictures.forEach(function(c) 
                {
                    mrow.push(Number(row[c]));
                });
                matrix.push(mrow);
            //console.log(mrow);
            }); 
            //console.log('1st row: ' + matrix[0]);
            //console.log(matrix);
        });

//---------------- Define diagram layout ----------------------------

        var chord = d3.layout.chord() //<-- produce a chord diagram from a matrix of input data
                .matrix(matrix)  //<-- data in matrix form
                .padding(0.05) 
                .sortSubgroups(d3.descending);

        var fill = d3.scale.category20(); //<-- https://github.com/mbostock/d3/wiki/API-Reference#d3scale-scales
            //console.log(fill);

        var g = svg.selectAll("g.group")
                .data(chord.groups)
                .enter().append("svg:g")
                .attr("class", "group"); 

                //console.log(g);

        // create arcs
        var arc = d3.svg.arc()
                .innerRadius(innerRadius)
                .outerRadius(outerRadius);

                //console.log(arc);

        g.append("path")
            .attr("d", arc)
            .style("fill", function(d) {  console.log(d.index); return fill(d.index);})
            .style("stroke", function(d) { return fill(d.index); })
            .attr("id", function(d, i) { return"group-" + d.index });;

        g.append("svg:text")
                .attr("x", 6)
                .attr("class", "picture")
                .attr("dy", 15)
            .append("svg:textPath")
                .attr("xlink:href", function(d) { return "#group-" + d.index; })
                .text(function(d) { return pictures[d.index]; }); 
            //console.log(g);

    </script>
    </body>
4

2 に答える 2

2

d3.tsv あなたの問題は、非同期であるという事実に起因します:

指定された URL にあるカンマ区切り値 (CSV) ファイルの HTTP GET 要求を発行します... 要求は非同期で処理されます。

その結果、「ダイアグラム レイアウトの定義」の下にあるすべてのコードが、データが読み込まれる前に実行されます。それ以外の場合、コードは正常に機能します (下の画像を参照)。したがって、すべてのコードをd3.tsv(...)呼び出しに移動するだけで、準備は完了です。

ここに画像の説明を入力

于 2014-11-10T16:41:45.830 に答える
1

スクリプトはエラーなしで実行されていますが、データ結合から要素が作成されていません。これは通常、長さ 0 のデータ配列を渡していることを示しています。

実際、配列をまったく渡していません。関数オブジェクトを渡しています。d3 がそのオブジェクトの配列の長さを調べると、undefined が返されます。これは数値 0 に強制されるため、グループもコードも作成されません。

コードの関連部分:

    var g = svg.selectAll("g.group")
            .data(chord.groups)
            .enter().append("svg:g")
            .attr("class", "group"); 

コード グループ データ オブジェクトの配列を実際に取得するには、 を呼び出す必要がありますchord.groups()()最後にがないchord.groups場合は、オブジェクトとしての関数の名前だけです。


追加するために編集:

d3.tsvおっと、描画コードがコールバック関数内に含まれていないことに気づきませんでした。mdml's answerで説明されているように修正してから、上記を修正します。

于 2014-11-10T16:41:54.460 に答える