我正在构建一个用于为 map 生成颜色的比例尺,其中各种范围的数字对应于颜色。在下面的比例中,a
、b
和 c
值(以及最小值和最大值)形成“步长”或“桶”对应颜色。在此示例中,-1
和 min
之间的任何内容都将被着色为 "#ffeda0
,以及 min
和 a
的颜色会有所不同:
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);
仅当 min
和 max
均为正数时才有效,因为您不能取零或负数的对数,并且在对数标度中,每个值都有与前一个因素相比,一个持续的积极因素。您可以通过调整符号来使其适用于负数 min
和 max
。
您可以使用其他基数进行计算,例如 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/