以下のコードが私にとってうまくいかない理由がわかりません。y軸のスケールが匿名関数内で定義されていません
:私はD3 v4を使用しています。 Iはy軸に沿って配置され別個カスタムパス要素(すなわち、カスタム形状)を作成したいdisplayData
の各要素について
// DATA JOIN
var dataJoin = vis.svg.selectAll(".group")
.data(vis.displayData);
// ENTER + UPDATE
var group = dataJoin.enter().append("g")
.attr("class", "group");
group.append("path") // ENTER
.attr("class", "line")
.style("opacity", 0.5)
.merge(group) // ENTER + UPDATE
.transition()
.duration(800)
.attr("d", function(d) {
return vis.y(d.beginDate); <------- vis.y() is undefined
});
。各パス要素は、y軸に沿った適切な点にパス要素を配置できるように、vis.y()尺度を使用する必要があります。
ただし、vis.y()は.attr関数呼び出しの中では未定義です。 なぜですか?私は他のD3ビジュアライゼーションをビルドしましたが(バージョン3を使用していましたが)、.attr関数呼び出しの内部でスケールを使用していました。なぜ今これに問題がありますか?
私は基本的に、y軸の別の場所から始まる各要素のカスタムパスをカスタムシェイプに追加しようとしています。私がこれを間違った方法で行っているような気がするなら、私に他の提案をお寄せください。
それは以下のスケール使用しています。データは以下のように構造化オブジェクトの配列です
vis.y = d3.scaleTime()
.range([vis.height, 0]);
vis.y.domain([
d3.min(vis.displayData, function(d) { return d.beginDate; }),
d3.max(vis.displayData, function(d) { return d.endDate; })
]);
を:
var obj = {
name: d.Name,
type: d.type,
beginDate: d.beginDate,
endDate: d.endDate,
eventDate: d.eventDate
};
'vis.y'が定義されていない理由は、私が言うことができませんあなたは十分なコードを表示していないので(つまり、どのようにvisが作成され、どの範囲に)いるのでしょうか?問題を再現する完全なコード例を投稿することをお勧めします。つまり、私はここで何かを逃しています、 'vis.y'はスケールであり、パスの' d'文字列属性を返しません。 – Mark
@マーク、ここでは謎です:https://jsfiddle.net/Ltjjj5p2/しかし、私は問題を再現することができませんでした。 d3.json()関数の中にすべてを追加すると、 'vis.y'は未定義です。私はそれの外にそれを引き出すと、それは動作します。だから何かが私がそれがスコープの問題かもしれないと思うだろうか? – Keven
実際、私は犯人を見つけたと思うが、なぜこれがそれに影響を与えるのかまだ分からない。私のコードは 'function loadData()'の中にラップされています。ページがロードされると、私は 'loadData(); 'を直接呼び出します。関数呼び出しを取り除いて、 'd3.json()'データロードを 'vis.y'の外部に引き出すと、利用可能です。何故ですか? – Keven