2016-06-16 2 views
1

与えられ、これは、私はこれが1を描画する主要なコードである。このexampleXファイルの配列を与えられたD3で1つのチャート1つのファイルによって供給+ Xチャートを描きたい+ D3

からで構築していますmy fiddle、ありますチャート。私はこの例では2つのファイルを持つarayを使用しています。

//array with 2 files(the same) just for example 
arr = ["https://dl.dropboxusercontent.com/u/49714666/data.tsv", "https://dl.dropboxusercontent.com/u/49714666/data.tsv"] 

var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

d3.tsv(arr[0], type, function(error, data) { 
    if (error) throw error; 

    x.domain(data.map(function(d) { 
    return d.letter; 
    })); 
    y.domain([0, d3.max(data, function(d) { 
    return d.frequency; 
    })]); 

    svg.append("g") 
    .attr("class", "x axis") 
    .attr("transform", "translate(0," + height + ")") 
    .call(xAxis); 

    svg.append("g") 
    .attr("class", "y axis") 
    .call(yAxis) 
    .append("text") 
    .attr("transform", "rotate(-90)") 
    .attr("y", 6) 
    .attr("dy", ".71em") 
    .style("text-anchor", "end") 
    .text("Frequency"); 

    svg.selectAll(".bar") 
    .data(data) 
    .enter().append("rect") 
    .attr("class", "bar") 
    .attr("x", function(d) { 
     return x(d.letter); 
    }) 
    .attr("width", x.rangeBand()) 
    .attr("y", function(d) { 
     return y(d.frequency); 
    }) 
    .attr("height", function(d) { 
     return height - y(d.frequency); 
    }); 


    svg.selectAll(".barText") 
    .data(data) 
    .enter().append("text") 
    .attr("class", "barText") 
    .attr("x", function(d) { 
     return x(d.letter); 
    }) 
    .attr("y", function(d) { 
     return y(d.frequency); 
    }) 
    .text(function(d) { 
     return d.frequency; 
    }); 

}); 

2番目のグラフを追加したい場合は、次のコードを追加する必要があります。注:私は新しいSVG svg2を宣言し、これに追加する必要があります。 編集私は同じコードたくさん書き換えていますようhere

var svg2 = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

d3.tsv(arr[1], type, function(error, data) { 
    if (error) throw error; 

    x.domain(data.map(function(d) { 
    return d.letter; 
    })); 
    y.domain([0, d3.max(data, function(d) { 
    return d.frequency; 
    })]); 

    svg2.append("g") 
    .attr("class", "x axis") 
    .attr("transform", "translate(0," + height + ")") 
    .call(xAxis); 

    svg2.append("g") 
    .attr("class", "y axis") 
    .call(yAxis) 
    .append("text") 
    .attr("transform", "rotate(-90)") 
    .attr("y", 6) 
    .attr("dy", ".71em") 
    .style("text-anchor", "end") 
    .text("Frequency"); 

    svg2.selectAll(".bar") 
    .data(data) 
    .enter().append("rect") 
    .attr("class", "bar") 
    .attr("x", function(d) { 
     return x(d.letter); 
    }) 
    .attr("width", x.rangeBand()) 
    .attr("y", function(d) { 
     return y(d.frequency); 
    }) 
    .attr("height", function(d) { 
     return height - y(d.frequency); 
    }); 


    svg2.selectAll(".barText") 
    .data(data) 
    .enter().append("text") 
    .attr("class", "barText") 
    .attr("x", function(d) { 
     return x(d.letter); 
    }) 
    .attr("y", function(d) { 
     return y(d.frequency); 
    }) 
    .text(function(d) { 
     return d.frequency; 
    }); 

}); 

は今、この偉大な方法ではありませんフィドルを参照してください。 しかし、私はファイル名のX要素の配列を与えるXチャートを描くことができるようにしたい。ファイルの形式は同じです。

誰も助言することができます、これを行う方法について正しい方向に私を指摘?

私は解決策を見つけようと努力しましたが、私は解き放たれました。 私はforループを使用すると思ったが、私はファイルのコールバックのためにデータを待っているので、d3.tsv関数が私の問題だと思う。

答えて

2

をTSVファイルのための提供するAPIを使用すると、使用することができます以下:

d3.tsv(url[, accessor][, callback]) 

あなたが行うために必要なことは、ループ内アペンドSVGの呼び出しを移動しましたアクセサー機能なし:

オプション付きアルアクセサ:

endpoints.forEach(function(endpoint, index) { 
    d3.tsv(endpoint, type, renderChart); 
}); 

各データエンドポイントに対応する関数を再利用するか、関数へのマッピングを作成します。この場合、私はあなたのチャートビルディングfnが同じであると思うので、これを行うことができます。

function renderChart(error, data) { 
    var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 
    // ..... rest of the code 

} 

ワーキングjsFiddle:https://jsfiddle.net/ygmkvreb/11/

+0

これはまだタイプ関数を使用していますか? – HattrickNZ

+1

@HattrickNZ型関数は、あなたの値が型番号であることを確認しているだけです。エラーを避けるために、それらの検証を持つことは常に良いです。あなたの場合、私はあなたがそれを使用していないと思う。だからあなたはそれを取り除くことができます。 – torresomar

+0

この場合、私はそうではないかもしれませんが、私は 'd3.tsv(" https://dl.dropboxusercontent.com/u/49714666/data.tsv "、type、function(error、data){..私はそれをどのように使うのでしょうか?以下の答えは 'type'関数を使っています。tks – HattrickNZ

2

forループを追加するのが最善の方法です。

var margin = {top: 20, right: 20, bottom: 30, left: 40}, 
 
    width = 960 - margin.left - margin.right, 
 
    height = 500 - margin.top - margin.bottom; 
 

 
var x = d3.scale.ordinal() 
 
    .rangeRoundBands([0, width], .1); 
 

 
var y = d3.scale.linear() 
 
    .range([height, 0]); 
 

 
var xAxis = d3.svg.axis() 
 
    .scale(x) 
 
    .orient("bottom"); 
 

 
var yAxis = d3.svg.axis() 
 
    .scale(y) 
 
    .orient("left") 
 
    .ticks(10, "%"); 
 

 
var arr = ["https://dl.dropboxusercontent.com/u/49714666/data.tsv","https://dl.dropboxusercontent.com/u/49714666/data.tsv"] 
 

 
for (this_file in arr) { 
 
d3.tsv(arr[this_file], type, function(error, data) { 
 
    if (error) throw error; 
 

 
    x.domain(data.map(function(d) { return d.letter; })); 
 
    y.domain([0, d3.max(data, function(d) { return d.frequency; })]); 
 

 
\t var svg = d3.select("body").append("svg") 
 
    .attr("width", width + margin.left + margin.right) 
 
    .attr("height", height + margin.top + margin.bottom) 
 
    .append("g") 
 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 
 
    
 
    svg.append("g") 
 
     .attr("class", "x axis") 
 
     .attr("transform", "translate(0," + height + ")") 
 
     .call(xAxis); 
 

 
    svg.append("g") 
 
     .attr("class", "y axis") 
 
     .call(yAxis) 
 
    .append("text") 
 
     .attr("transform", "rotate(-90)") 
 
     .attr("y", 6) 
 
     .attr("dy", ".71em") 
 
     .style("text-anchor", "end") 
 
     .text("Frequency"); 
 

 
    svg.selectAll(".bar") 
 
     .data(data) 
 
    .enter().append("rect") 
 
     .attr("class", "bar") 
 
     .attr("x", function(d) { return x(d.letter); }) 
 
     .attr("width", x.rangeBand()) 
 
     .attr("y", function(d) { return y(d.frequency); }) 
 
     .attr("height", function(d) { return height - y(d.frequency); }); 
 
     
 
    
 
svg.selectAll(".barText") 
 
     .data(data)         
 
     .enter().append("text") 
 
     .attr("class", "barText") 
 
     .attr("x", function(d) { return x(d.letter); }) 
 
     .attr("y", function(d) { return y(d.frequency); }) 
 
     .text(function(d) { return d.frequency; }); 
 
     
 
}); 
 

 
} 
 

 
function type(d) { 
 
    d.frequency = +d.frequency; 
 
    return d; 
 
}
.bar { 
 
    fill: steelblue; 
 
} 
 

 
.bar:hover { 
 
    fill: brown; 
 
} 
 

 
.axis { 
 
    font: 10px sans-serif; 
 
} 
 

 
.axis path, 
 
.axis line { 
 
    fill: none; 
 
    stroke: #000; 
 
    shape-rendering: crispEdges; 
 
} 
 

 
.x.axis path { 
 
    display: none; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

+0

TKS、ここでは[フィドル](https://jsfiddle.net/HattrickNZ/ygmkvreb/16/)があるが、さらなる問題として、私は、グラフのタイトルを追加しましたグラフごとに要素の値にしたい場合は、各グラフのタイトルと同じです。 – HattrickNZ

関連する問題