我正在使用d3来构建散点图,我对x和y轴的值集都有正值和负值。这是我第一次尝试使用d3,我从On the tenth day of Xmas, get dirty with data using d3.js等入门教程中收集到,关键是正确设置x和y比例。
接下来,我发现了这个教程:Bar Chart with Negative Values,它几乎帮助我做到了(我认为)。我的数据集太大了,不能放在这里,但这里是我可以使用的数据样本的代码:
<div id="compareAll"></div>
<script>
window.onload = function() {
var dataSet = [ [4,4], [-4,4], [-4,-4], [4,-4], ];
var x0 = Math.max(-d3.min(dataSet[0]), d3.max(dataSet[0]));
var xScale = d3.scale.ordinal()
.domain([-x0,x0])
.range([0,10]);
var yScale = d3.scale.ordinal()
.domain(d3.range(dataSet[1])
.rangeRoundBands([0,10]);
var svg = d3.select("#compareAll")
.append("svg")
.attr("width", 10)
.attr("height",10)
svg.selectAll("circle")
.data(dataSet)
.enter()
.append("circle")
.attr("cx", function(d) {
return xScale(d[0]);
})
.attr("cy", function(d) {
return yScale(d[1]);
})
.attr("r",4);
var xAxis = d3.svg.axis()
.scale(xScale)
.tickSize(1);
var yAxis = d3.svg.axis()
.scale(yScale)
.tickSize(1);
svg.append("svg:g")
.attr("class", "x axis")
.attr("transform", "translate(0,10)")
.call(xAxis);
svg.append("svg:g")
.attr("class", "y axis")
.attr("transform", "translate(10,0)")
.call(yAxis);
}
</script>
坦率地说,我不理解在条形图示例中使用序数标度,但是当我将其取出并使yScale使用与xScale相同的语法时,我的结果似乎更差。
任何有关使用两个轴的正值和负值的最佳方法的解释都将受到赞赏。如果我遗漏了一些明显的东西,请告诉我。我将这个例子放在一个更大的项目中,以使其尽可能具体且易于阅读。
谢谢!
答案 0 :(得分:10)
对轴使用负值没有什么特别之处 - 您应该只为轴使用线性刻度,并将域设置为[min, max]
,其中min
可能是负值。
在此处查看代码的工作版本:http://jsfiddle.net/nrabinowitz/qN5Sa/
关于此的几点说明:
除非您需要更多的矩阵,否则绝对应该使用线性比例作为散点图。标准x刻度可能如下所示:
var xScale = d3.scale.linear()
.domain([-5, 5])
.range([0,w]);
d3.svg.axis()
组件包含.orient()
设置 - 默认情况下,这是"bottom"
,即数字低于该行的水平轴。要制作正确定向的y轴,请使用.orient('left')
。
我没有包含代码来根据您的数据确定每个轴的最小/最大域,因为我认为它会使示例复杂化。但是如果你不知道数据的界限,你可以相当容易地做到这一点:
// assuming data like [[x0,y0], [x1,y1]]
var xmin = d3.min(data, function(d) { return d[0] }),
xmax = d3.max(data, function(d) { return d[0] }),
ymin = d3.min(data, function(d) { return d[1] }),
ymax = d3.max(data, function(d) { return d[1] });