2016-04-07 14 views
2

私はCSVデータを読み込み、d3.nest()を使用して年ごとにデータをグループ化することで、毎年のデータに対して、barchartを描くことができました。ブロックhereまたはblockbuilder hereを参照してください。 しかし、私は現在、annotations配列のメモを各グラフに追加しようとしています。私は立ち往生しています。d3 barchartに注釈の配列を追加するにはどうすればよいですか?

私が試みているアプローチの1つは、selectAll(".charts")で、ネストされた注釈配列、つまりannotationsPerYearを追加することです。しかし、私はannotationsPerYearキーを自分のチャートに追加してから、毎年のノートを反復して正しいチャートに追加するのは難しいと思っています。何か案は?

答えて

1

これにネストされた選択を使用することができます。あなたは既に、このビットで、ネストされた選択を使用している:

svg.selectAll(".bar") 
    .data(function(d) {return d.values;}) 

上記以前に作成した3 SVGsのそれぞれに異なるデータをバインドします。これはfunction(d)を3回呼び出すことで行い、毎回異なるd.valuesを返します。

同様のことをして、各SVGに別々の注釈セットをバインドして作成することができます。チャートごとに適用可能な注釈を返す関数(data()に渡す)が必要ですが、今回はd.valuesのように事前計算されたものはありません。代わりに、あなたはfilter()を使用して、annotations配列のうち、該当する注釈を抽出する必要があります:あなたは、テキストを作成し、それを配置するために、バーのために行われてきたようにその後、あなたはenter()append()を使用することができます

svg.selectAll(".annotation") 
    .data(function(d) { 
    // return annotations whose key matches d's key 
    return annotations.filter(function(a) { return a.key == d.key; }); 
    }) 

。私はあなたがそれをレイアウトするつもりかわからないんだけど、完全にあなたは、このような何かしたい:

svg.selectAll(".annotation") 
    .data(function(d) { 
    return annotations.filter(function(a) { return a.key == d.key; }); 
    }) 
.enter() 
    .append("text") 
    .attr("class", "annotation") 
    .attr("x", function(d) { return x(d.xPos); }) 
    .attr("y", function(d) { return d.yPos; }) 
    .text(function(d) { return d.note; }) 

参照:

+0

完璧だ、おかげで。そして、はい、私はキーを一致させると、私はそれをレイアウトする方法だった。私はうるう年と別の問題に気付きました。 2016年のデータには2月29日が含まれています。これはx.domainを設定したところでこれに取り組むことができますか?または私はここに新しい質問を掲示すべきですか? – eoin

+0

それは別々の問題ではなく、おそらく独自の投稿にふさわしいものです。ええ、それは、時間スケールに切り替えることによって、または尺度の領域に29番目を含むことを保証することによって、xスケールを通して対処されるべきです。前者は複雑です(バーの配置/サイジングがより複雑になるため)、後者は、毎年29回目が表示されることを意味します(非閏年のバーはありません)。だからそれはあなたが達成しようとしているものに依存します。 – meetamit

関連する問題