2013-02-19 58 views
2

我正在绘制2D图形中的一些浮点数据,并且需要将图形的轴校准为看起来整齐的小单元。显然这个单位根据数据的大小而变化。我试图找出一个很好的方法来将轴分成好看的数字。例如如果我的数据从 -1.3345到+5.882可能会以1.0或0.5为单位进行划分。如果我的数据从-100到800将坐标轴分为100或50的单位(我希望这很有意义),现在我将范围(最大值 - 最小值)除以某个固定整数,然后获得单位给我带有长尾数字的难看数字。有没有这样做的聪明方式?在C++中进行图形轴校准

+0

同时,我刚刚阅读了这条推文:https://twitter.com/headinthebox/status/303588840180944896 – Johnsyweb 2013-02-19 02:18:53

+0

看看[gnuplot](http://www.gnuplot.info)是如何做到的。 [Asymptote](http://asymptote.sourceforge.net)也可以绘制图表,这可能会更容易理解。 – vonbrand 2013-02-19 02:34:19

回答

1

ACM Algorithm 463提供了三个简单的功能,以产生具有输出xminp,xmaxp和DIST的最小和的规模和在标尺刻度标记之间的距离最大值良好轴秤,给出n间隔包括所述数据的请求点xminxmax

  1. Scale1()给出的线性标尺与大约n间隔和dist为10倍1,2或5
  2. Scale2()的整数次幂给出了一个线ar标度,间隔正好为n(xminp和xmaxp之间的差距往往大于Scale1()产生的差距)。
  3. Scale3()给出了一个对数尺度。

该代码位于Fortran中,但解释并转换为其他语言非常简单。有更复杂的功能可以提供更漂亮的比例(例如gnuplot中的那些),但Scale1很可能会用最少的代码为您完成这项工作。

(EDIT)

我发现,原来1973年论文在线here,它提供了比连接到上面的代码更多的解释文本。

+0

这篇文章很好但是我不知道fortan 。猜猜我必须找到能翻译的人。谢谢。 – 2013-02-19 03:48:01

+0

@da_elysian_fields。免费翻译器[f2c](www.netlib.org/f2c/)非常出色,可以将任何年份的Fortran翻译成C或C++。 – Simon 2013-02-19 19:08:05

2

计算好步骤的一种方法是找到该范围长度的最高有效位数值(即diff = maxVlaue - minValue),并将其作为步骤使用。要计算价值的最显著位利用这个简单的公式:

pow(10, floor(log10(diff))) 

这需要区别的十进制数,丢弃小数部分,如果有的话,并提出了十是对数的电源。如果差值为7.2165,则计算结果将返回1;对于721.65,它将返回100,依此类推。

这个计算的一个缺点是的网格步长为9.99,而diff为1.001的网格步长是相同的。解决这个问题的一种方法是计算你为该步骤获得的网格线的数量,如果线数不足(例如少于三),则减少步骤十次。

+0

我尝试了你建议的方法。我遇到了你指出的问题。这个建议非常明确,并且很容易遵循这个感谢。猜猜我应该尝试创建自己的函数来解决问题,谢谢 – 2013-02-19 03:51:33