1

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

例如,假设我目前有一个图表,上面有三个数据点。(0, 100), (1,500), (2,930)。

我目前拥有的简单代码将 Y 轴最小值设置为 100,将 Y 轴最大值设置为 930。这个想法是为了防止没有 0 值的数据集扭曲图表的大小。这行得通,但我觉得它可能会好得多。

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

我觉得我需要几点信息:

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

从那里我有点茫然。

如果我将 930 作为最大数据点值,我知道它的数量级是 3。因此,我将其最大值加 1 并将其余值加 0 - 结果为 1000。

如果我将 1030 作为最大数据点值,我知道它的数量级是 4。如果我将其最大值加 1 并为零,其余的结果是 2000。Excel 在绘图时将 1200 绘制为最大范围 (0, 100 ), (1,500), (2,930), (3,1030)。

这个问题在较大的值下会迅速退化——总是增加最大值并不完全正确,但有时确实如此。有没有人有这方面的经验可以对更好的方法有所了解?

4

2 回答 2

3

一个相当稳健的方法如下:

  • 取范围r = max - min
  • 假设填充约。百分之五(必要时调整数字),pad = r * 0.05
  • 四舍五入pad到下一个(1,2,5)*10^n(例如0.23将四舍五入到,0.55.5将四舍五入到10)。
  • axis_min = floor(min/pad-1)*pad
  • axis_max = ceil(max/pad+1)*pad
于 2011-09-27T17:14:31.610 回答
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

其中padding是 和 之间的数字01例如0.05

于 2011-09-27T17:03:08.090 回答