如何以对数方式可视化一系列值?
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 :)
}
修改函数中的值,直到找到适合您的完美曲线。
我正在为城市可视化气泡,如果城市的价值越大,气泡就越大。例如:
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 :)
}
修改函数中的值,直到找到适合您的完美曲线。