積み上げられた縦棒グラフを更新する際に問題が発生します。 (TL; DR:there's a fiddle here、エラーは194-5行で発生します)。各列は、ビタミンを表し、その後Appleはvitimin Aの5つの単位を有するであろう、ビタミンBの4ことを想像d3.stackデータ構造の更新データ結合パターンを取得できません
[
[ [0,5], [0,4], [0,6], [0,3] ], // key: apple
[ [5,7], [4,7], [6,7], [3,3] ] // key: banana
]
:例として、stack
関数によって作成されたデータ構造は次のようになり
、等...、とオレンジなどのビタミンAの2台、3 OビタミンB、
を持つことになり、私は私のES6クラスでグラフを作成することができます。
this.svg.append("g")
.attr("class", "seriesGroup")
.selectAll("g")
.data(stack(this.data))
.enter()
.append("g")
.attr("class", (d,i) => { return "series" + i})
.selectAll("rect")
.data((d) => { return d; })
.enter()
.append("rect")
.attr("class", ("bar"))
.attr("x", (d) => { return this.x(d.data.perception); })
.attr("y", (d) => { return this.y(d[1]); })
.attr("height", (d) => { return this.y(d[0])- this.y(d[1]); });
.attr("width", this.x.bandwidth())
コードは次の構造を作成します。
<g class="seriesGroup">
<g class="series0> //apple
<rect class="bar">
...
</g>
<g class="series1"> //banana
...
ただし、更新は難しいです。私はリンゴのシリーズをゼロにデータを変更し、再度stack
を呼び出す場合、私が今持っている:
[
[ [0,0], [0,0], [0,0], [0,0] ], // key: apple
[ [0,2], [0,3], [0,1], [0,0] ] // key: banana
]
ここに私の更新コードは次のとおりです。
let seriesGroup = this.svg.selectAll(".seriesGroup")
.data(stack(newData))
.attr("class", "seriesGroup updated");
let series = seriesGroup.enter()
.selectAll((d,i) => { console.log(i + " series data is " + d); return ".series" + i })
.data((d) => { console.log(d); return d; })
.enter()
.attr("class", (d) => { console.log(d); return "series updated2" });
series.enter()
.selectAll("rect")
.data((d) => { console.log(d); return d; })
.attr("class", ("bar updated"))
.transition().duration(this.settings.transitionDuration)
.attr("y", (d) => {
console.log("Now setting y to " + this.y(d[1]) + " and height to " + (this.y(d[0]) - this.y(d[1])) + " for data " + d);
return this.y(d[1]); })
.attr("height", (d) => { return this.y(d[0])- this.y(d[1]); });
どういうわけか、このコード/ SVG構造の組み合わせが原因となっていますd3ライブラリのTypeError: this.setAttribute is not a function
。エラーの原因となった行は次のとおりです。
.attr("class", (d) => { console.log(d); return "series updated2" });
明らかに私はデータ結合に失敗していますが、わかりません。私は間違って何をしていますか?
ルックseries' 'で:あなたは、** 3 **'入力します() '関数を持っている**なし** 'append()'関数と 'attr()'関数の束です。あなたがここで何をしようとしているのか分かりません。 –
3つの入力関数は、データ構造の3つのレベルを反映しています:最初の ''はデータがスタック配列全体であり、2番目が ''です。 、第3ののデータは、行から積み上げられた '[lowerValue、upperValue]'のペアです。 svg要素の数が変更されるべきではないので、 'append()'はありません。私は、既存の ' '要素の高さを変更しようとしています。提供されたフィドルリンクは、それがどのように動作するのか、途中で中断する方法を示しています。 –
Escher
上記のあなたのコメントを読んだ後、 "入力"の選択と、 'enter()'メソッドの目的を勉強することをお勧めします。これは建設的な批判です。 –