2011-04-14 51 views
6

我試圖在ListLogLogPlot上自定義格式刻度標籤。通過搜索Mathgroup檔案,它看起來像通常的方式來混淆刻度標籤是使用AbsoluteOptions提取它們,用自定義格式運行替換規則,然後用Ticks->{...}選項明確地將它們提供給繪圖功能。但是,下列情況不爲ListLogLogPlot工作:在ListLogLogPlot的刻度標籤中強制使用科學記數法

foo = ListLogLogPlot[Range[20]^3, Frame -> True]; 
ticks=(FrameTicks /. AbsoluteOptions[foo, FrameTicks]) 

如何處理這個任何想法..


編輯:這裏很多很好的答案的!接受巫師先生,因爲它被證明是解決當前眼前問題最簡明的方法,但我看到我自己使用了未來建議的其他方法。

+3

是的,我在這裏:http://forums.wolfram.com/mathgroup/archive/2009/Apr/msg00757.html和這裏:http://forums.wolfram.com/mathgroup/archive/2009/ Apr/msg00762.html,以及幾個小時前在這個SO問題純屬意外:http://stackoverflow.com/questions/5664937/adaptive-gridlines/5666435#5666435 – 2011-04-14 22:13:43

+0

@Sjoerd爲什麼這不是一個答案,所以我可以投票嗎? – 2011-04-15 10:09:53

+0

@ Mr.Wizard好吧,正如我所看到的那樣,這實際上並不是Leo問題的答案,它專門針對ListLogLogPlot中的錯誤。順便說一句:我剛剛更新了我上面提到的答案,包括belisarius的新輸入。據我所知,新代碼不像黑客,但不適用於LogPlots。你仍然必須使用舊的方法。另一件事:我想提請你注意我最後更新之下的無關緊要的警告。不知道該怎麼做,但我覺得這個警告應該更廣泛地瞭解。 – 2011-04-15 10:25:15

回答

6

人們可以使用替代惹直接標籤,繞過Option/AbsoluteOptions

ListLogLogPlot[Range[20]^3, Frame -> True] /. 
    (FrameTicks -> x_) :> 
     (FrameTicks -> (x /. {a_?NumericQ, b_Integer, s___} :> 
     {a, Superscript[10, [email protected]], s})) 

enter image description here


由於Alexey Popkov這是現在改進和較不易碎。

+0

非常優雅! +1。但是應該謹慎使用這個技巧,因爲這種技巧依賴於「ListLogLogPlot」的版本依賴行爲。 – 2011-04-15 11:57:39

+1

我認爲通過用{{a_?NumericQ,b_Integer,s ___}'和'{a,Superscript [10,Log10}替換'{a_?NumericQ,b_Integer}',可以使這個代碼更加通用, @ b]}'by'{a,Superscript [10,Log10 @ b],s}'。 – 2011-04-15 12:09:20

+0

@Alexey,請編輯我的答案,因此你的名字也出現在答案上。請儘量保持格式。 – 2011-04-15 12:12:36

4

看起來像一個bug給我。簡單調用AbsoluteOptions[foo]會產生錯誤消息。雖然普通老Options[foo]工作正常。

0

發送包含此代碼的電子郵件至[email protected]。他們將能夠告訴你是否有更好的解決方法。

5

像Sjoerd,我一般喜歡寫,計算的飛行蜱功能:

PowerTicks[label_][min_, max_] := Block[{min10, max10}, 
    min10 = Floor[Log10[min]]; 
    max10 = Ceiling[Log10[max]]; 
    Join[Table[{10^i, 
    If[label, Superscript[10, i], Spacer[{0, 0}]]}, {i, min10, 
    max10}], 
    Flatten[ 
    Table[{k 10^i, 
     Spacer[{0, 0}], {0.005, 0.`}, {Thickness[0.001`]}}, {i, min10, 
     max10}, {k, 9}], 1]] 
    ] 

ListLogLogPlot[Range[20]^3, Frame -> True, 
FrameTicks -> {{PowerTicks[True], 
    PowerTicks[False]}, {PowerTicks[True], PowerTicks[False]}}] 
5

爲了補充Brett的answer,看看CustomTicksLevelScheme。它提供了兩個功能用於生成刻度標記「LinTicks and LogTicks」,並且每個都有一系列格式選項。目前,它需要你自己執行的對數,即

Plot[ {Log[10,Cosh[x]], Log[10, Sinh[x]]}, {x, 0, 4}, Frame -> True, 
     FrameTicks -> { LinTicks, LogTicks, None, None }] 

LogPlot of cosh and sinh over 0 to 4

對於數據的列表,很明顯,你不得不使用Log[Base, data]ListPlot,但它是可行的。我已經提交了一個補丁馬克迪卡普里奧這樣下會做同樣的事情如上

LogPlot[ {Cosh[x], Sinh[x]}, {x, 0, 4}, Frame -> True, 
     FrameTicks -> { LinTicks, LogTicks, None, None }] 

如果補丁被接受的LogTicks舊的形式將訪問通過設置選項PlotTypeLinearLogarithmic是默認。使用CustomTicks的優勢是其他基地很容易

code for and plot of Exp[-x^2] from 0 to 3

和像你想它會自動將其格式化。

編輯:我也想指出,這是CustomTicks本身裝載,分離的LevelScheme休息。而且,由於它是一個小型軟件包,所以沒有太多額外的開銷。

+0

+1等級 – Simon 2011-04-15 13:25:00

+0

@Simon,目前唯一的問題是你必須自己執行對數。但是,幸運的是,它不會那麼久。 – rcollyer 2011-04-15 13:26:33

+0

我抵制多年學習'LevelScheme'。 「CustomTicks」今天的良好體驗可能會最終改變這一點。謝謝。 – ArgentoSapiens 2012-01-13 23:42:26