计算折线图的最小/最大Y轴值

时间:2011-09-27 16:59:39

标签: algorithm microsoft-chart-controls

我试图复制Excel在计算折线图的Y轴边界方面的'正确'感觉。

作为一个例子,假设我目前有一个包含三个数据点的图表。 (0,100),(1,500),(2,930)。

我目前使用的简单代码将Y轴最小值设置为100,将Y轴最大值设置为930.这样做的目的是防止没有0值的数据集偏移图表的大小。这有效,但我觉得它可能会好得多。

对于上面的例子,Excel绘制了0到1000范围内的数据点。我正在尝试创建一个绘制相同“感觉良好”范围的通用算法。然而,事实证明这有点棘手。

我觉得我需要一些信息:

  • 上限值和下限值的数量级(10的幂)。
  • 始终采用数据点的上限/下限 - 当数据点与绘制的最大/最小范围共享相同的值时,不是很清楚。

从那里我有点失落。

如果我将930作为最大数据点值,我知道它的数量级为3.因此,我将其中一个加到其最大值,其余为0,结果为1000。

如果我将1030作为最大数据点值,我知道它的数量级为4.如果我将其中的一个加到其最大值而其余部分为零,则结果为2000. Excel绘制时将1200绘制为最大范围( 0,100),(1,500),(2,930),(3,1030)。

这个问题在较大的值时会迅速降低 - 总是增加最大值并不完全正确,但有时也是如此。有没有人有这方面的经验可以让我们对更好的方法有所了解?

2 个答案:

答案 0 :(得分:3)

一种非常强大的方法如下:

  • 取范围r = max - min
  • 假设填充大约。百分之五(必要时调整数字),pad = r * 0.05
  • 围绕pad轮到下一个(1,2,5)*10^n(例如0.23将四舍五入为0.5,而5.5将四舍五入为10 )。
  • 采取axis_min = floor(min/pad-1)*pad
  • 采取axis_max = ceil(max/pad+1)*pad

答案 1 :(得分:1)

为什么不只是让范围来自:

(1-padding) * minimum_value // minimum > 0
(1+padding) * minimum_value // minimum < 0

(1+padding) * maximum_value // maximum > 0
(1-padding) * maximum_value // maximum < 0

其中padding01之间的数字,例如0.05