2015-07-10 78 views
0

我需要通过给出一组值来为图上的图例生成值。 是否有任何Java库中的函数可以根据数组值和计数值生成范围或隔离区?喜欢的东西:Java - 根据最小值,最大值和计数生成隔离区/间隔

Integer[] getIntervals(Number[] values , int count); 

用法示例:

getIntervals([10, 33.5, 45.98, 62, 77,80 ], 5)将返回[10, 24, 38, 52, 64, 80]

这是很容易由自己来写,但它必须做聪明地表现出来不错的传奇地图。智能我的意思是生成一个对传说有意义的数字。我不知道如何用英文描述它,所以我附上了一张截图,显示了我的意思。

如果上述功能是我想要的智能方式,它会返回: [10, 30, 50, 70, 90]或类似的东西。

enter image description here

这仍然是我可以写我自己,但也许这是冥冥中早已做了什么?我查看了Apache Commons MathUtils和Apache Commons Math,但找不到我需要的东西。

编辑:我发现有在Apache共享一个Percentile类似乎是我需要使用,但我在数学上太弱了。

+1

目前还不清楚你在问什么。为什么上面的阵列不比最下面的阵列好?你如何定义一个这样的智能方法?根据我的理解,你需要一个生成数字列表的函数,每对邻居(从左到右)与前一对具有较大的差异。 – Mackiavelli

+1

您是否想'getIntervals'来计算图例中要使用的范围?你希望范围大小相等吗?还是希望每个范围内的值的数量尽可能均匀? – Simon

+0

是否存在符合你的主观(和未公开)“智能”标准的东西?也许,但可能不会。 –

回答

1

您的问题需要解决,但我选择将其解读为“我正在尝试为可视化目的的一系列输入值创建很好的间隔滴答”。在这种情况下,我建议你长时间看how D3.js implements such scales。是的,Javascript不是Java--但是D3.js是一个众所周知的可视化库,你描述的问题是一个众所周知的可视化问题,并且语法与Java相似 - 足以让你很容易地适应这些想法。

简而言之,并松散地平移:

public interface LinearScale { 
    /** 
    * build a scale from min to max; see d3 linear.domain() 
    * and then expand it to make it end in nice, round numbers; 
    * see d3 linear.nice() 
    */ 
    void setNiceDomain(double min, double max); 
    /** 
    * set number of threshold values; see d3 linear.ticks() 
    * and return their values 
    */ 
    double[] setThresholdCount(int ticks); 
    /** 
    * gets the largest threshold that is <= a given value 
    */ 
    double map(double value); 
} 

(JS)的源代码可在https://github.com/mbostock/d3/blob/master/src/scale/linear.js; (从执行linear.ticks()):

function d3_scale_linearTickRange(domain, m) { 
    if (m == null) m = 10; 

    var extent = d3_scaleExtent(domain), 
     span = extent[1] - extent[0], 
     step = Math.pow(10, Math.floor(Math.log(span/m)/Math.LN10)), 
     err = m/span * step; 

    // Filter ticks to get closer to the desired count. 
    if (err <= .15) step *= 10; 
    else if (err <= .35) step *= 5; 
    else if (err <= .75) step *= 2; 

    // Round start and stop values to step interval. 
    extent[0] = Math.ceil(extent[0]/step) * step; 
    extent[1] = Math.floor(extent[1]/step) * step + step * .5; // inclusive 
    extent[2] = step; 
    return extent; 
} 

function d3_scale_linearTicks(domain, m) { 
    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); 
} 
+0

你看了我的脑海:) –

相关问题