如何以对数方式可视化一系列值?

How to visualise a range of values logarithmically?

我正在为城市可视化气泡,如果城市的价值越大,气泡就越大。例如:

London: 14500
New York: 100
Tokyo: 1100

数值范围为 ~100-15000

我在创建将 return 合理值的函数时遇到问题,因此 100 个值气泡不会太小。我能想到的唯一方法是设置最小尺寸,例如:

if (size < 5) { size = 5 }

但是,这会导致值为 ~100 的城市看起来与值为 ~1000 的城市非常相似。我想要大约 0-15000 到 return 的值作为 0.5 和 1 之间的值(或类似的值)。这将如何完成?

这是我目前的情况,但就像我说的那样,它导致值 100 和值 1000 都低于最小值:

var minBulletSize = 7.5;
var maxBulletSize = 20;
var maxSquare = maxBulletSize * maxBulletSize * 2 * Math.PI;
var minSquare = minBulletSize * minBulletSize * 2 * Math.PI;

// create circle for each location
for (var i = 0; i < mapData.length; i++) {
    var dataItem = mapData[i];
    var value = dataItem.value;
    // calculate size of a bubble
    var square = (value/1000 - minBulletSize) / (maxBulletSize - minBulletSize) * (maxSquare - minSquare) + minSquare;
    if (square < minSquare) {
        square = minSquare;
    }
    if (square > maxSquare) {
        square = maxSquare;
    }
    var size = Math.sqrt(square / (Math.PI * 2));
    var id = dataItem.code;
}

我已经了解了如何使对数函数看起来 "logarithmic" 在 0.5 和 1 的约束内:

Math.log10(x / 0.8 + 1) / 3 + 0.5 其中 x 介于 0 到 24.5 之间。

这纯粹是一个对我来说看起来不错的功能,尽管在更大的数字中可以看到明显的增长,但您可以尽早获得非常动态的数字。

随意弄乱数字,这是非常主观的。

接下来您需要将 100~15000 的范围调整到 0 到 24.5 之间。 我会简单地做一个 x = (x - 100) / 608.16 让你的范围在 0 到 24.5 之间。

var minBulletSize = 7.5;
var maxBulletSize = 20;
var maxSquare = maxBulletSize * maxBulletSize * 2 * Math.PI;
var minSquare = minBulletSize * minBulletSize * 2 * Math.PI;

// create circle for each location
for (var i = 0; i < mapData.length; i++) {
    var dataItem = mapData[i];
    var value = dataItem.value;
    // assuming value is in between 100 and 15000
    value = (value - 100) / 608.16;
    value = Math.log10(value / 0.8 + 1) / 3.0 + 0.5;
    // value will be in between 0.5 and 1 on a logarithmic scale.
    // Do what you want with it :)
}

修改函数中的值,直到找到适合您的完美曲线。