私はd3とnvd3に比較的慣れていないので、例と同じように、序数のy軸を使用して単純な散布図を作成したいと考えていました。したがって、y 軸の値はカテゴリ文字列です。これは私がする必要があると私が思ったことです:
var xfun = function (d) { return d.Pos } //simple ints
, yfun = function (d) { return d.Title } //the ordinal values
var chart = nv.models.scatterChart()
.showDistX(true)
.showDistY(true)
.color(d3.scale.category10().range())
.margin({ top: 30, right: 20, bottom: 50, left: 130 })
.tooltips(false)
.x(xfun)
.y(yfun);
// create an ordinal scale with some test values
var ys = d3.scale.ordinal()
.domain(["this","is","an","ordinal","scale"])
.range(5);
// tell nvd3 to use it
chart.yAxis.scale(ys);
// add to the page
nv.addGraph(function () {
d3.select(selector).datum(data).transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
return chart;
});
ただし、運が悪い:
Error: Invalid value for <circle> attribute cy="NaN" d3.js:690
Error: Invalid value for <line> attribute y1="NaN" d3.js:690
Error: Invalid value for <line> attribute y2="NaN" d3.js:690
Error: Invalid value for <circle> attribute cy="NaN" d3.js:7532
Uncaught TypeError: Cannot read property '0' of undefined
..
また、y 軸は単純に -1 から 1 までの線形軸を示しています。興味深いことに、y=-1 と y=1 (極値) にいくつかの円がプロットされています。
手動で cy の正しい値を強制するために、call(chart) の後に追加してみました:
d3.selectAll("#mychart circle").attr("cy", function(d){
return = ys(yfun(d));
});
しかし、それでも同じエラーです。序数スケールを適切に機能させるにはどうすればよいですか? nvd3 凡例を使用してデータ系列 (異なる x/y データを含む) を切り替えるときにも、正しく更新する必要があることに注意してください。
github に関連する質問がありますが、解決策はありません。
更新:いくつかのデバッグの後、置き換えchart.yAxis.scale(ys)
てみましたがchart.scatter.y(ys)
、これによりエラーが解消されます。説明書も落とせますselectAll
。
ただし、y 軸は引き続き 0.99 ~ 1.01 の線形スケールを示し、すべてのポイントは y=1 にプロットされます。一歩近づきましたが、序数スケールはまだありません。