【问题标题】:Quantize Integers into discrete buckets将整数量化为离散桶
【发布时间】:2015-02-12 20:09:50
【问题描述】:

我有一个约 7500 个项目的列表,它们都有相似的签名:

{
    revenue: integer,
    title: string,
    sector: string
}

收入将在 0 到 10 亿之间。我想构建一个规模,使得给定特定公司的收入......它返回其相对于以下“桶”的位置:

$0-5 Million
$5-10 Million
$10-25 Million
$25-50 Million
$50-100 Million
$100-250 Million
> $250 Million

我相信我应该能够在 d3 中使用量化或分位数来实现这一点,但很难获得预期的结果。到目前为止,我有类似的东西:

var max_rev = 1000000000 // 1 Billion
scale = d3.scale.quantize().domain(_.range(max_rev)).range([5000000, 10000000, 25000000, 50000000, 100000000, 250000000])

一个明显的问题是调用 _.range(max_rev) 会创建一个包含 10 亿个项目的数组,所以我想知道如何更有效地做到这一点(例如 .domain([0, 1000000000])?)

定义这个比例的最佳方法是什么,这样,scale(75000000) 将返回 50000000。一旦我有了它,我可以对照哈希检查它并返回正确的标签:

{
    ...
    ...
    50000000: "$50-100 Million",
    100000000: "$100-250 Million",
    ...

}

非常感谢!如果我能提供任何其他信息,请告诉我。

【问题讨论】:

    标签: d3.js charts quantile quantization


    【解决方案1】:

    在这种情况下,量化比例不起作用,因为您的域和范围没有被均匀分割。相反,您可以使用 threshold 比例。

    这是一个例子:

    var dollars = d3.format("$,d"),
      data = d3.range(100).map(function(d, i) {
          return {
              revenue: parseInt(Math.random() * 1000000000),
              title: "Company " + i,
              sector: "Sector " + parseInt(Math.random() * 10)
          }
      }),
      quantize = d3.scale.threshold()
                         .domain([5000000, 10000000, 25000000, 50000000, 100000000, 250000000])
                         .range([0, 5000000, 10000000, 25000000, 50000000, 100000000, 250000000]);
    
    var table = d3.select("#info").append("table");
    
    table.append("thead").append("tr").selectAll("th")
        .data(['company', 'sector', 'revenue', 'quantized_revenue'])
      .enter()
        .append("td")
        .text(function(d) {
          return d;
        });
    
    var rows = table.append("tbody").selectAll("tr")
        .data(data)
      .enter()
        .append("tr")
        .attr("class", "company")
    
    rows.append("td").text(function(d) {
        return d.title;
    });
    rows.append("td").text(function(d) {
        return d.sector;
    });
    rows.append("td").text(function(d) {
        return dollars(d.revenue);
    });
    rows.append("td").text(function(d) {
        return dollars(quantize(d.revenue));
    });
    table {
        width: 100%;
    }
    thead {
        background-color: #ccc;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
    <div id="info"></div>

    有趣的是:

      quantize = d3.scale.threshold()
                         .domain([5000000, 10000000, 25000000, 50000000, 100000000, 250000000])
                         .range([0, 5000000, 10000000, 25000000, 50000000, 100000000, 250000000]);
    

    domain 设置与输入值进行比较的阈值,range 定义输出。碰巧在这种情况下,rangedomain 基本相同,但并非必须如此。 range 可以是颜色值列表、用于定义条形高度的像素等。

    您甚至可以这样做,并避免在哈希表中查找结果:

    var dollars = d3.format("$,d"),
      data = d3.range(100).map(function(d, i) {
          return {
              revenue: parseInt(Math.random() * 1000000000),
              title: "Company " + i,
              sector: "Sector " + parseInt(Math.random() * 10)
          }
      }),
      quantize = d3.scale.threshold()
                         .domain([5000000, 10000000, 25000000, 50000000, 100000000, 250000000])
                         .range(["$0-5", "$5-10", "$10-25", "$25-50", "$50-100", "$100-250",  "> $250"].map(function(d) { return d + " Million"; }));
    
    var table = d3.select("#info").append("table");
    
    table.append("thead").append("tr").selectAll("th")
        .data(['company', 'sector', 'revenue', 'quantized_revenue'])
      .enter()
        .append("td")
        .text(function(d) {
          return d;
        });
    
    var rows = table.append("tbody").selectAll("tr")
        .data(data)
      .enter()
        .append("tr")
        .attr("class", "company")
    
    rows.append("td").text(function(d) {
        return d.title;
    });
    rows.append("td").text(function(d) {
        return d.sector;
    });
    rows.append("td").text(function(d) {
        return dollars(d.revenue);
    });
    rows.append("td").text(function(d) {
        return quantize(d.revenue);
    });
    table {
        width: 100%;
    }
    thead {
        background-color: #ccc;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
    <div id="info"></div>

    【讨论】:

    • 哇,非常感谢!我不知道阈值比例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2019-02-04
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多