首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对数范围

对数范围
EN

Stack Overflow用户
提问于 2014-03-19 15:33:14
回答 2查看 1.8K关注 0票数 1

我有一个非常稀疏的数据集,我想用一个对数比例的直方图来绘制它。我希望X轴看起来类似于:

1,10,100,1000,10000

这意味着第一个垃圾桶将包括花费1-10,第二个11-10等等的观测,最后一个是+10.000。

代码语言:javascript
运行
复制
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,但它似乎不像预期的那样工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-19 16:08:32

d3阈值标度根据所选择的阈值将量化数据集拆分为离散类别。

与简单的线性尺度不同,阈值尺度的域不是最小值和最大值。相反,阈值标度的域是要拆分数据的阈值列表。

与所有d3标度一样,范围是所需的输出值。但是,对于阈值尺度,范围内的输出值必须等于阈值(域)值加上一个的数量。范围中的第一值被赋值给小于第一阈值的值,范围中的第二值被赋值给等于或大于第一阈值但小于第二阈值的值,等等,直到范围中的最后一值被赋值给等于或大于域中最后一值的值。

因此,要根据10的幂将正整数数组拆分为类别,您可以使用10的幂作为域,并使用一组字符串描述类别为您的范围。

代码语言:javascript
运行
复制
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这样的自定义函数可能更通用,因为它不需要您指定在/低于/高于/低于的最大和最小阈值,因为在这个阈值之上/低于这个阈值,所有的东西都会聚集在同一个类别中。但如果这是你想要的,那么以上的阈值应该可以做到这一点。

票数 2
EN

Stack Overflow用户

发布于 2014-03-19 15:54:34

如果您只是在寻找一个映射您的值的函数,您所需要的只是一些简单的数学:

代码语言:javascript
运行
复制
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没有经验,所以我不能帮你。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22510760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档