将无限值范围缩放到有限区间

时间:2013-09-02 08:32:20

标签: algorithm language-agnostic data-visualization

我希望以类似直方图的方式显示测量值。用户可以在各种测量之间进行选择,这些测量本质上是非常不同的。例如,方法复杂度通常会产生介于1和20之间的值。相反,源文件最后一次更改的日期会产生unix时间戳,这是非常大的数字。

我知道如何将这些值范围简单地缩放到直方图的大小(高度),但这种方法有时会产生非常混乱的结果。例如,当所有值都非常大时,直方图中的所有条几乎都是最大高度,并且几乎不能察觉到差异。在这种情况下,从所有值中减去接近最小值的常数可能是有利的,以获得更独特的可视化。

其他测量值在非常小的值范围内产生值,例如1到3.在这种情况下,可视化是非常误导的,因为3将被缩放到最大可能的大小,1到最小可能的大小,并且差异看起来很大,虽然它不是。在这种情况下,为所有值添加常量可能是有利的,以减少直方图条之间的差异。

是否有任何解决此问题的一般方法,一方面确保独特性,另一方面避免误导性可视化?任何算法都可以很好地将任意一系列值放入给定的区间内?

2 个答案:

答案 0 :(得分:2)

我过去使用的一种方法是将exp(lbound(log(min(data))))exp(ubound(log(max(data))))作为我的范围,选择适合我审美的任何日志基础。

答案 1 :(得分:1)

{x_i}成为您的值集,然后min = min{x_i}max = max{x_i}

现在可以使用:

对[0,1]间隔中集合上的每个值进行标准化
x_i = (x_i - min) / (max - min)

正如您可以看到的那样,max元素将为1,min将为0,并且itnermediate值将保持其比例。如果不在直方图中对0值进行排序,则可以对此进行缩放添加常量,然后min将为alpha和最大1 + alpha

通常,您可以映射[a,b]区间中的每一组:

x_i = a + (x_i - min) * ( b - a ) / (max - min)