图(图)算法

图(图)算法

Graph (Chart) Algorithm

有人在计算轴的最小值和最大值时有一个不错的算法吗?

在为一组给定的数据项创建图表时,我希望能够提供以下算法:

  • 集合中的最大(y)值
  • 集合中的最小(y)值
  • 轴上出现的刻度线数
  • 一个必须显示为刻度的可选值(例如,显示ve和-ve值时为零)

算法应返回

  • 最大轴值
  • 最小的轴值(尽管可以从最大的轴值,间隔大小和刻度数推断出)
  • 间隔大小

刻度线应有规律的间隔,大小应为"合理"(例如1、3、5,甚至可能是2.5,但不再有其他无花果)。

可选值的存在将使此值倾斜,但是如果没有该值,则最大的项目应出现在顶部两个刻度线之间,而最小值则位于底部两个刻度线之间。

这是一个与语言无关的问题,但是如果周围有C#/。NET库,那将是捣毁;)


好的,这是我为我们的一个应用程序想到的。请注意,它不会处理您提到的"可选值"方案,因为我们的可选值始终为0,但您修改起来并不难。

数据会不断添加到序列中,因此我们只需检查每个数据点的添加情况即可保持y值的范围为最新;这是非常便宜的并且易于跟踪。最小和最大值相等是特殊情况:间距为0表示不应绘制任何标记。

此解决方案与上述安德鲁的建议没有什么不同,不同之处在于它以某种有点模糊的方式处理了指数乘数的任意分数。

最后,此示例在C#中。希望对您有所帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    private float GetYMarkerSpacing()
    {
        YValueRange range   = m_ScrollableCanvas.
                    TimelineCanvas.DataModel.CurrentYRange;
        if ( range.RealMinimum == range.RealMaximum )
        {
            return 0;
        }

        float   absolute    = Math.Max(
                    Math.Abs( range.RealMinimum ),
                    Math.Abs( range.RealMaximum ) ),
            spacing     = 0;
        for ( int power = 0; power < 39; ++power )
        {
            float   temp    = ( float ) Math.Pow( 10, power );
            if ( temp <= absolute )
            {
                spacing = temp;
            }
            else if ( temp / 2 <= absolute )
            {
                spacing = temp / 2;
                break;
            }
            else if ( temp / 2.5 <= absolute )
            {
                spacing = temp / 2.5F;
                break;
            }
            else if ( temp / 4 <= absolute )
            {
                spacing = temp / 4;
                break;
            }
            else if ( temp / 5 <= absolute )
            {
                spacing = temp / 5;
                break;
            }
            else
            {
                break;
            }
        }

        return spacing;
    }

我可以推荐以下内容:

  • 设置吸引人的主线最少数量。这将取决于您提供的数据的性质以及正在执行的绘图的大小,但是7是一个很好的数字
  • 根据1、2、5、10等的进阶选择指数和乘数,这样至少会给您最少的主线数。 (即(最大-最小)/(比例x 10 ^指数)> = minimum_tick_marks)
  • 找到适合您范围的指数和乘数的最小整数倍。这将是第一个主要的滴答声。其余的价格变动是由此得出的。

它用于允许任意缩放数据的应用程序,似乎工作良好。


我一直在使用jQuery flot图形库。它是开源的,并且很好地完成了轴/刻度线的生成。我建议您看一下它的代码并从那里捏一些想法。


推荐阅读

    linux命令实时显示?

    linux命令实时显示?,系统,实时,时间,信息,情况,命令,对比,电脑,名称,一致,lin

    linux编译时显示命令?

    linux编译时显示命令?,系统,基础,工具,代码,百度,下来,网上,命令,内核,文件,L

    linux显示运行命令?

    linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如

    显示linux网卡命令行?

    显示linux网卡命令行?,系统,信息,工具,网络,服务,电脑,网卡,技术指标,地址,

    linux命令显示内容?

    linux命令显示内容?,标准,系统,数据,命令,百度,实时,时间,信息,文件,内容,lin

    linux常用显示命令?

    linux常用显示命令?,工作,地址,系统,信息,管理,命令,目录,标准,功能,常用命

    linux用命令显示账号?

    linux用命令显示账号?,密码,系统,信息,地址,电脑,名字,用户,命令,用户名,用

    linux命令行同步显示?

    linux命令行同步显示?,地址,工具,系统,数据,工作,时间,命令,综合,网址,信息,L

    linux命令显示窗口?

    linux命令显示窗口?,系统,工具,首页,终端,密码,命令,窗口,界面,桌面,选项,lin

    linux分页显示命令?

    linux分页显示命令?,工具,通信,命令,数据,信息,管道,标准,位置,一致,系统,lin

    linux中ps命令显示?

    linux中ps命令显示?,系统,信息,状态,进程,命令,多地,软件,工作,基础,报告,lin

    linux命令逐页显示?

    linux命令逐页显示?,系统,工作,地址,命令,网上,信息,百度,基础,标准,内容,在l

    linux显示内核命令?

    linux显示内核命令?,地址,发行,信息,工具,电脑,系统,名称,内核,版本,状态,如

    显示等号linux命令?

    显示等号linux命令?,工作,地址,信息,系统,命令,目录,标准,管理,基础,常用命

    linux中显示路径命令?

    linux中显示路径命令?,系统,地址,工作,信息,时间,命令,数据,网络,路径,名字,l

    linux显示的命令行?

    linux显示的命令行?,信息,标准,数据,命令,实时,系统,时间,名称,文件,文件名,l

    linux命令多显示几行?

    linux命令多显示几行?,实时,系统,标准,数据,档案,命令,文件,最新,信息,状态,l

    linux命令行显示键值?

    linux命令行显示键值?,系统,环境,管理,文化,国家,信息,工具,数据,软件,项目,L

    linux用命令显示键盘?

    linux用命令显示键盘?,系统,信息,工具,电脑,键盘,分析,设备,数据,通用,工作,L

    linux命令分行显示?

    linux命令分行显示?,数据,分行,系统,时间,最新,百度,实时,命令,文件,内容,lin