1

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

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

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

是否有任何通用的方法来解决这个问题,一方面确保独特性,另一方面避免误导性的可视化?任何算法可以很好地将任意一系列值拟合到给定的间隔中?

4

2 回答 2

2

我过去使用的一种方法是采用exp(lbound(log(min(data))))exp(ubound(log(max(data))))作为我的范围,选择适合我审美的任何原木底座。

于 2013-09-02T08:41:22.363 回答
1

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

您现在可以在 [0,1] 区间内对集合中的每个值进行归一化,使用:

x_i = (x_i - min) / (max - min)

如您所见,最大元素将为 1,最小元素将为 0,并且中间值将保持它们的比例。如果您没有在直方图中排列 0 值,则可以稍微缩放一下添加一个常数,那么 min 将是alphamax 1 + alpha

通常,您可以映射间隔中的每个集合[a,b]

x_i = a + (x_i - min) * ( b - a ) / (max - min)
于 2013-09-02T08:37:50.493 回答