如何以对数方式显示一系列值?

时间:2015-10-02 08:37:51

标签: javascript algorithm logarithm

我正在想象城市的泡沫,如果城市有更大的价值,那就更大了。例如:

London: 14500
New York: 100
Tokyo: 1100

值范围从~100-15000

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

if (size < 5) { size = 5 }

但是,这会导致值大约为100的城市与价值约为1000的城市非常相似。我希望大约0-15000的值返回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;
}

1 个答案:

答案 0 :(得分:1)

我已经看过如何使对数函数看起来像对数&#34;在0.5和1的限制范围内:

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

这纯粹是一个对我来说看起来很好的功能,你可以尽早获得非常动态的数字,尽管可以看到更大数量的明显增长。

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

接下来,您需要在0到24.5范围内适应100~15000范围。 我只需要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 :)
}

修改函数中的值,直到找到适合自己的曲线。