如何计算数值轴的主要单位

时间:2012-06-06 08:17:17

标签: actionscript-3 charts rounding

我想在y轴上显示三个标签:minmiddlemax。 max - min = 9572。 查找中间的最简单方法是9572/2 = 4786.这些值不太好,因此Excel可能会将间隔增加到1000并将middle设置为500。

在给出minmax时,如何计算y轴的漂亮值? min和/或max可能是否定的。

2 个答案:

答案 0 :(得分:2)

好问题!最近我解决了类似的问题和我所做的事情:

  1. 创建一系列可能的步骤,例如[1,2,5,10,20,25,50,75,100,200,250,500,750,1000,2000,2500,5000,7500,10000 ]
  2. 确定您需要多少标签 - 我猜它是3
  3. 从数组中选择步骤。 9572 /(3 - 1)= 4786,最近步长为5000.您可以将距离与下一步和前一步进行比较并在此处进行自定义舍入,例如,如果非舍入步长比下一步少20%,请选择下一步,否则上一个。
  4. 为min标签选择好看的起点。取实际最小值,除以所选步长(5000)。舍入结果(您可以使用floor作为最小值,ceil作为最大值)并将其乘以所选步骤。例如,如果min = -3400且max = 2700:

    scaleMin = floor(-3400 / 5000)* 5000 = -5000
    scaleMax = ceil(2700/5000)* 5000 = 5000

  5. 这将给出三个标签:-5000,0和5000.如果你可以容忍y轴低于图形最大值的最后一个标记,不要只使用ceil(或floor)。计算图表最大值百分比是否超出标记,如果太多,则添加一步。

答案 1 :(得分:0)

可能有助于在C#中提供实现。我的样本可能不适用于负y轴值。希望它可以帮到某人!

private double GetMajorStep(double yAxisMax)
    {
        int[] stepArray = {1, 2, 5, 10, 20, 25, 50, 75, 100, 200, 250, 500, 750, 1000, 2000, 2500, 5000, 7500, 10000, 20000, 50000,100000, 500000,1000000};
        const int numLabels = 2;
        var stepSize = (int) (yAxisMax/(numLabels - 1));
        var possibleSteps = stepArray.Where(p => p < stepSize).ToList();
        if (!possibleSteps.Any()) return stepSize;

        var nearest = possibleSteps.OrderBy(x => Math.Abs((long)x - stepSize)).First();
        return nearest;
    }