2013-02-19 57 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