データの構造を変更する必要があります。今書かれているように、generateData()
関数は 20 個の値を取り、それらを同じ配列にプッシュします。これにより、データ変数は次の構造を持つオブジェクトの配列になります。
data = [
{ value: "253.65", date: "2006"},
{ value: "269.67", date: 2007 },
...
];
このデータ構造により、d3 は 2006 年から 2012 年までの 1 本の接続された線を描画し、2006 年に再び 2 回描画します。
3 つの異なる行を取得するには、d3 が各シリーズを個別のオブジェクトとして認識できるように、データを分割する必要があります。次のような構造にデータを入れることを検討してください。
data = [
{
name: "series01",
points: [
{ value: "253.65", date: "2006"},
{ value: "269.67", date: 2007 },
...
]
},
{
name: "series02",
points: [
{ value: "253.65", date: "2006"},
{ value: "269.67", date: 2007 },
...
]
},
{
name: "series01",
points: [
{ value: "253.65", date: "2006"},
{ value: "269.67", date: 2007 },
...
]
}
];
もちろん、これを行う場合は、他の d3 コンポーネントを書き直して、円の x 値と y 値が各シリーズ オブジェクトの points プロパティ内にネストされているという事実に対処する必要があります。複数の線の描画について詳しくは、複数の線 d3を参照してください。
コメントへの返信として追加:
rawdata 要素を 1 つずつデータに割り当てるサイズ ループが問題です。これは、d3 がデータを処理する方法に反します。最初のループで、d3 はデータ配列の 7 つの要素に対して 7 つのパスと円に入ります。
.enter()
データ配列の変更に基づいて新しい svg 要素のみを追加します。キーが使用されていない場合、変更は配列の長さによって駆動されます。ループの 2 回目と 3 回目ではデータ配列の長さが変わらないため、新しいパスは追加されません。
3 行すべてを取得するには、ループを削除し.data(rawdata)
、データに を使用して、行の 'd' 属性を に変更します.attr('d', line(d.points))
。
残念ながら、これは円を台無しにします。同じデータに円と線を描画する方法については、この Google グループのディスカッションで Mike Bostocks の svg:g 要素の提案をご覧ください https://groups.google.com/forum/?fromgroups=#!topic/d3-js/ 8XLzUYLoFnY