我想以类似直方图的方式显示测量值。用户可以在本质上非常不同的各种测量之间进行选择。例如,方法复杂度通常产生 1 到 20 之间的值。相比之下,源文件的最后一次更改日期产生 unix 时间戳,这是非常大的数字。
我知道如何简单地将这些值范围缩放到直方图的大小(高度),但这种方法有时会产生非常困惑的结果。例如,当所有的值都很大时,直方图中的所有条形几乎都是最大高度,几乎感觉不到差异。在这种情况下,从所有值中减去一个接近最小值的常量以获得更独特的可视化效果可能会更好。
其他测量值在非常小的值范围内产生值,例如 1 到 3。在这种情况下,可视化非常具有误导性,因为 3 将缩放到可能的最大大小,而 1 将缩放到可能的最小大小,并且差异看起来很大,其实不然。在这种情况下,最好向所有值添加一个常数,以减少直方图条之间的差异。
是否有解决这个问题的通用方法,一方面确保独特性,另一方面避免误导性的可视化?是否有任何算法可以很好地将任意一系列值拟合到给定区间?
最佳答案
让 {x_i}
成为您的一组值,然后是 min = min{x_i}
, max = max{x_i}
。
您现在可以在 [0,1] 区间内标准化集合中的每个值,使用:
x_i = (x_i - min) / (max - min)
如您所见,最大元素将为 1,最小元素将为 0,中间值将保持其比例。如果您不在直方图中排列 0 值,则可以稍微缩放一下并添加一个常量,然后最小值将是 alpha
,最大值将是 1 + alpha
。
通常,您可以映射区间 [a,b]
中的每个集合,执行以下操作:
x_i = a + (x_i - min) * ( b - a ) / (max - min)
关于algorithm - 将无限值范围缩放到有限区间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18568764/