我对 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 的正确值,我尝试在调用(图表)之后添加:
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 处。所以更近了一步,但还没有序数尺度。