我相对来说比较新于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的正确值,我尝试在调用(chart)后添加:
d3.selectAll("#mychart circle").attr("cy", function(d){
return = ys(yfun(d));
});
但仍然出现相同的错误。我如何使序数比例尺正常工作?请注意,当我使用nvd3图例切换数据系列(其中包含不同的x/y数据)时,我也需要它正确更新。
在github上有一个相关问题,但没有解决方案。
更新:经过一些调试,我尝试用
chart.scatter.y(ys)
替换chart.yAxis.scale(ys)
,这样就可以消除错误。我也可以放弃手动选择selectAll
。然而,y轴仍然显示从0.99到1.01的线性刻度,并且所有点都绘制在y=1处。所以离有序比例尺还有一步之遥。