首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图上“漂亮”网格线间隔的算法

图上“漂亮”网格线间隔的算法
EN

Stack Overflow用户
提问于 2008-12-12 01:54:20
回答 13查看 41.9K关注 0票数 69

我需要一个合理的智能算法来为一个图(图表)画出“漂亮”的网格线。

例如,假设条形图的值为10、30、72和60。你知道:

最小值: 10最大值: 72范围: 62

第一个问题是:你从什么开始?在这种情况下,0将是直观的值,但这在其他数据集上不成立,所以我猜:

网格最小值应为0或小于范围内数据的最小值的“不错”值。或者,可以指定它。

网格最大值应该是一个高于范围内最大值的“很好”的值。或者,可以指定它(例如,如果您显示百分比,则可能需要0到100,而不考虑实际值)。

范围内的网格线(刻度)的数量应该是指定的,或者是给定范围(例如3-8)内的一个数字,这样这些值就是“不错的”(即舍入数字),并且您可以最大限度地利用图表区域。在我们的示例中,80将是一个合理的最大值,因为这将使用图表高度的90% (72/80),而100将创建更多浪费空间。

有人知道解决这个问题的好算法吗?语言是无关紧要的,因为我将在需要的地方实现它。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2008-12-12 02:19:55

CPAN提供了一个实现here (参见源码链接)

另请参阅

仅供参考,使用您的示例数据:

..70,72

  • MATLAB:

  • Maple: Min=8,Max=74,Labels=10,20,..,60,70,Ticks=10,12,14, Min=10,Max=80,Labels=10,20,,..,60,80
票数 11
EN

Stack Overflow用户

发布于 2008-12-12 02:09:49

这个问题有两个方面:

  1. 确定所涉及的数量级,
  2. 取整为方便的值。

您可以使用对数来处理第一部分:

代码语言:javascript
复制
range = max - min;  
exponent = int(log(range));       // See comment below.
magnitude = pow(10, exponent);

因此,例如,如果您的范围是50 - 1200,指数是3,幅值是1000。

然后,通过决定在网格中需要多少细分来处理第二部分:

代码语言:javascript
复制
value_per_division = magnitude / subdivisions;

这是一个粗略的计算,因为指数已被截断为整数。您可能希望调整指数计算以更好地处理边界条件,例如,如果最终细分过多,则通过四舍五入而不是采用int()

票数 30
EN

Stack Overflow用户

发布于 2009-02-13 13:41:02

我使用以下算法。它与这里发布的其他示例类似,但它是C#中的第一个示例。

代码语言:javascript
复制
public static class AxisUtil
{
    public static float CalcStepSize(float range, float targetSteps)
    {
        // calculate an initial guess at step size
        var tempStep = range/targetSteps;

        // get the magnitude of the step size
        var mag = (float)Math.Floor(Math.Log10(tempStep));
        var magPow = (float)Math.Pow(10, mag);

        // calculate most significant digit of the new step size
        var magMsd = (int)(tempStep/magPow + 0.5);

        // promote the MSD to either 1, 2, or 5
        if (magMsd > 5)
            magMsd = 10;
        else if (magMsd > 2)
            magMsd = 5;
        else if (magMsd > 1)
            magMsd = 2;

        return magMsd*magPow;
    }
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/361681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档