Leo*_*yev 7 wolfram-mathematica
我正在尝试在ListLogLogPlot上自定义格式标签.通过搜索Mathgroup存档,看起来混乱使用刻度标签的常用方法是使用AbsoluteOptions
自定义格式运行替换规则,然后使用该Ticks->{...}
选项将它们显式地提供给绘图函数.但是,以下内容对ListLogLogPlot不起作用:
foo = ListLogLogPlot[Range[20]^3, Frame -> True];
ticks=(FrameTicks /. AbsoluteOptions[foo, FrameTicks])
Run Code Online (Sandbox Code Playgroud)
关于如何处理这个问题的任何想法?
编辑:这里有很多好的答案!接受Wizard先生,因为它被证明是解决眼前问题的最简洁方法,但我发现自己使用了将来建议的其他方法.
可以使用替换件直接弄乱标签,绕过Option
/ AbsoluteOptions
:
ListLogLogPlot[Range[20]^3, Frame -> True] /.
(FrameTicks -> x_) :>
(FrameTicks -> (x /. {a_?NumericQ, b_Integer, s___} :>
{a, Superscript[10, Log10@b], s} ))
Run Code Online (Sandbox Code Playgroud)
感谢Alexey Popkov,现在它已经改善,不那么脆弱了.
和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]}}]
Run Code Online (Sandbox Code Playgroud)
为了补充Brett的答案,请查看LevelScheme中的CustomTicks
包.它提供了两个用于生成刻度线'LinTicks LogTicks`的函数,每个函数都有许多格式化选项.目前,它要求您自己执行对数,即and
Plot[ {Log[10,Cosh[x]], Log[10, Sinh[x]]}, {x, 0, 4}, Frame -> True,
FrameTicks -> { LinTicks, LogTicks, None, None }]
Run Code Online (Sandbox Code Playgroud)
给
对于数据的列表,显然你必须使用Log[Base, data]
同ListPlot
,但它是可行的.我已经向Mark Caprio提交了一个补丁,以便以下内容与上面完全相同
LogPlot[ {Cosh[x], Sinh[x]}, {x, 0, 4}, Frame -> True,
FrameTicks -> { LinTicks, LogTicks, None, None }]
Run Code Online (Sandbox Code Playgroud)
如果补丁被接受的旧形式,LogTicks
将通过设置选项来获得PlotType
到Linear
,Logarithmic
是默认的.使用的优点CustomTicks
是其他基础很容易
它会像你想要的那样自动格式化.
编辑:我还想指出,它CustomTicks
本身可以加载,与其余部分分开LevelScheme
.并且,因为它是一个小包装,所以没有太多额外的开销.