我有一个非常稀疏的数据集,我想用一个对数比例的直方图来绘制它。我希望X轴看起来类似于:
1,10,100,1000,10000
这意味着第一个垃圾桶将包括花费1-10,第二个11-10等等的观测,最后一个是+10.000。
function (pow, min, max) {
var range = [];
for (i = min; i < max; i++) {
range.push(Math.pow(pow, i));
}
return range;
}我能够生成给定的10的幂数组。现在,我想要的是将一组连续的值映射到该数组,这意味着:
1,23,2,105,2000年,30000
产出如下:
1,10,1,100,1000,10000
我尝试过使用d3.scale.threshold,但它似乎不像预期的那样工作。
发布于 2014-03-19 16:08:32
d3阈值标度根据所选择的阈值将量化数据集拆分为离散类别。
与简单的线性尺度不同,阈值尺度的域不是最小值和最大值。相反,阈值标度的域是要拆分数据的阈值列表。
与所有d3标度一样,范围是所需的输出值。但是,对于阈值尺度,范围内的输出值必须等于阈值(域)值加上一个的数量。范围中的第一值被赋值给小于第一阈值的值,范围中的第二值被赋值给等于或大于第一阈值但小于第二阈值的值,等等,直到范围中的最后一值被赋值给等于或大于域中最后一值的值。
因此,要根据10的幂将正整数数组拆分为类别,您可以使用10的幂作为域,并使用一组字符串描述类别为您的范围。
scale = d3.scale.threshold()
.domain([1, 11, 101, 1001, 10001])
.range(["<1", "1-10", "11-100", "101-1000", "1001-10,000", ">10,001"]);当然,根据您正在使用的比例,像@Daniele Torino这样的自定义函数可能更通用,因为它不需要您指定在/低于/高于/低于的最大和最小阈值,因为在这个阈值之上/低于这个阈值,所有的东西都会聚集在同一个类别中。但如果这是你想要的,那么以上的阈值应该可以做到这一点。
发布于 2014-03-19 15:54:34
如果您只是在寻找一个映射您的值的函数,您所需要的只是一些简单的数学:
function f(x) {
return Math.pow(10, Math.floor(Math.log(x) / Math.log(10)));
}
alert( f(1) );
alert( f(23) );
alert( f(2) );
alert( f(105) );
alert( f(2000) );
alert( f(30000) );我对d3没有经验,所以我不能帮你。
https://stackoverflow.com/questions/22510760
复制相似问题