javascript - 为什么 d3.histogram 会合并此图表的最后两个 bin?

标签 javascript d3.js histogram

在我正在处理的这个 D3 图表中,我有一个包含 60 个元素的非线性模式的波段尺度(101-110;201-210;301-310;401-410;501-510 和 601- 610——第一个数字代表季节,最后两位数字代表最后两位数字)。

我能够完美地呈现图表,但最后一个柱形会合并到它之前的柱形中:

busted histogram :sob:

(忽略 x 轴标签都乱七八糟的事实。)

知道为什么会这样吗?仅仅是因为我完全曲解了直方图的含义,还是什么?

完整示例代码 here .

最佳答案

您是对的:您完全曲解了直方图的含义!这应该是一个条形图。

条形图,就其本质而言,是由代表分类变量的条形图组成的。这意味着条形图位于代表分类变量(即定性变量)的标签上。条形图和直方图都使用矩形来编码数据,但在直方图中,与条形图不同的是,标签代表一个定量变量。这是很常见的,如果你在网上搜索,找到实际上是条形图的“直方图”,或者实际上是直方图的“条形图”。

回到你的问题:有可能在一个 hacky 解决方案中保留你的直方图:你只需要定义 domain :

If domain is specified, sets the domain accessor to the specified function or array and returns this histogram generator.

因此,您的直方图生成器应该是这样的:

const histogram = d3.histogram()
    .value(d => d.death)
    .domain([0, 1000])//in your case: [101 or less, more than 610]
    .thresholds(x.domain());

(我在这里使用魔术数字只是为了展示这个想法,相应地改变它们)

这是更新后的代码:https://www.webpackbin.com/bins/-KgCh8IjK6J56Dj_SA9X

分析

显然,当值与阈值一致时,d3.histogram 不会创建最后一个 bin。根据文档,应该创建最后一个 bin,因为 x1(每个 bin 的最高值)不包含在内。

让我们看看这个片段:

var data = d3.range(10);

const histogram = d3.histogram()
  .value(d => d)
  .thresholds(data);

var bins = histogram(data);

console.log(bins)
<script src="https://d3js.org/d3.v4.js"></script>

你可以看到 8 和 9 一起放在最后一个 bin 中。

其他阈值不会发生同样的事情。首先,thresholdFreedmanDiaconis:

var data = d3.range(100);

const histogram = d3.histogram()
  .value(d => d)
  .thresholds(d3.thresholdFreedmanDiaconis(data, d3.min(data), d3.max(data)));

var bins = histogram(data);

console.log(bins)
<script src="https://d3js.org/d3.v4.js"></script>

然后,thresholdScott:

var data = d3.range(100);

const histogram = d3.histogram()
  .value(d => d)
  .thresholds(d3.thresholdScott(data, d3.min(data), d3.max(data)));

var bins = histogram(data);

console.log(bins)
<script src="https://d3js.org/d3.v4.js"></script>

最后,thresholdSturges:

var data = d3.range(100);

const histogram = d3.histogram()
  .value(d => d)
  .thresholds(d3.thresholdSturges(data, d3.min(data), d3.max(data)));

var bins = histogram(data);

console.log(bins)
<script src="https://d3js.org/d3.v4.js"></script>

关于javascript - 为什么 d3.histogram 会合并此图表的最后两个 bin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036419/

相关文章:

r - R 中的直方图 - x 轴未正确居中

javascript - 如何解决 “cannot call method … of undefined” 错误?

javascript - 凸包(路径)中是否有 svg 元素?

javascript - 使用 D3.js 制作旭日图

javascript - 将 nodejs/express 应用程序中的 json 文件加载到 d3

python :使用 numpy.histogram

python - python/scipy 中 3D 方向的直方图

javascript - 想要选择某个单词索引的parentNode

javascript - 如何在 NodeJS 中传递命令行参数?

javascript - 如何替换 div 中的所有单词实例(可以嵌套),要替换的单词将基于 json 文件