javascript - 创建具有最小值、最大值和离散值的对数刻度 "steps"

标签 javascript algorithm logarithm

我正在构建一个用于为 map 生成颜色的比例尺,其中各种范围的数字对应于颜色。在下面的比例中,abc 值(以及最小值和最大值)形成“步长”或“桶”对应颜色。在此示例中,-1min 之间的任何内容都将被着色为 "#ffeda0,以及 mina 的颜色会有所不同:

  return [
    "#e7e9e9",
    -1,
    "#ffeda0",
    min,
    "#fed976",
    a
    "#feb24c",
    b
    "#fd8d3c",
    c
    "#fc4e2a",
    max
    "#e31a1c"
  ];

此比例始终以最小值(称为 min)开始,并以最大值(max)结束。我目前有一个简单的线性比例尺,如下所示:

  const min = Math.min(data);
  const range = Math.max(data) - min;
  const step = range / 4;

  return [
    "#e7e9e9",
    -1,
    "#ffeda0",
    min,
    "#fed976",
    min + step,
    "#feb24c",
    min + step * 2,
    "#fd8d3c",
    min + step * 3,
    "#fc4e2a",
    max,
    "#e31a1c"
  ];

如何编写一个函数,在给定最小值、最大值和刻度中的步数(在本例中为三)的情况下,输出对数刻度的正确数字?

最佳答案

对数标度的对数是线性的。所以:

const min = Math.min(data);
const max = Math.max(data);

const logmin = Math.log(min);
const logmax = Math.log(max);

const logrange = logmax - logmin;
const logstep = logrange / 4;

现在线性标度已经

value = min + n * step;

对数刻度有:

value = Math.exp(logmin + n * logstep);

仅当 minmax 均为正数时才有效,因为您不能取零或负数的对数,并且在对数标度中,每个值都有与前一个因素相比,一个持续的积极因素。您可以通过调整符号来使其适用于负数 minmax

您可以使用其他基数进行计算,例如 10:

const logmin = Math.log10(min);
const logmax = Math.log10(max);

value = Math.pow(10, logmin + n * logstep);

或者,您可以通过取最小值和最大值商的 n 次根来找到从一步到下一步的公因数:

const min = Math.min(data);
const max = Math.max(data);

const fact = Math.pow(max / min, 1.0 / 4.0);

然后通过重复乘法找到这些值:

value = prev_value * fact

value = xmin * Math.pow(fact, n);

即使比例应该有很好的整数,这两种方法也可能会产生“不整齐”的数字,因为对数和n根可能会产生不准确的浮点结果。如果您选择舍入因子并调整最小/最大值,您可能会得到更好的结果。

关于javascript - 创建具有最小值、最大值和离散值的对数刻度 "steps",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71722781/

相关文章:

javascript - 使用 HTML 输入提交表单

javascript - Angular Directive(指令),与 bool 值的双向数据绑定(bind)只能工作一次

python - 汉诺塔 - 用 Python 解决中途算法

MatLab:对数 z 轴和 bar3 的奇怪显示

python - 在Python中以对数尺度插值

javascript - 处理 null JSON 对象

javascript - Node.js、puppeteer 和延迟加载

java - 计算房间数量的洪水填充算法

c - 数组删除用户输入值的所有元素

r - 使用 R 在直方图中使 y 轴对数