3

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

min当和被给定时,我如何为我的 y 轴计算好的值maxmin和/或max可能是负面的。

4

2 回答 2

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. 为最小标签选择好看的起点。取您的实际最小值,除以所选步长 (5000)。将结果四舍五入(您可以使用floor最小值和ceil最大值)并将其乘以所选步长。例如,如果 min = -3400 且 max = 2700:

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

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

于 2012-06-06T10:08:21.893 回答
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;
    }
于 2014-12-31T17:16:19.817 回答