Wolfram mathematica ListLogPlot勾号标签中的强制科学符号
我正在尝试自定义ListLogPlot上的勾号标签格式。通过搜索Mathgroup归档文件,处理记号标签的通常方法似乎是使用Wolfram mathematica ListLogPlot勾号标签中的强制科学符号,wolfram-mathematica,Wolfram Mathematica,我正在尝试自定义ListLogPlot上的勾号标签格式。通过搜索Mathgroup归档文件,处理记号标签的通常方法似乎是使用AbsoluteOptions提取记号标签,使用自定义格式运行替换规则,然后使用Ticks->{…}选项显式将记号标签提供给绘图函数。但是,以下内容不适用于ListLogPlot: foo = ListLogLogPlot[Range[20]^3, Frame -> True]; ticks=(FrameTicks /. AbsoluteOptions[foo, Fr
AbsoluteOptions
提取记号标签,使用自定义格式运行替换规则,然后使用Ticks->{…}
选项显式将记号标签提供给绘图函数。但是,以下内容不适用于ListLogPlot:
foo = ListLogLogPlot[Range[20]^3, Frame -> True];
ticks=(FrameTicks /. AbsoluteOptions[foo, FrameTicks])
有没有办法处理这个问题
编辑:这里有很多好答案!接受Wizard先生的建议,因为它被证明是解决眼前问题的最简洁的方法,但我认为我自己将来会使用其他建议的方法。对我来说就像一个bug。简单调用
AbsoluteOptions[foo]
会产生错误消息。普通的旧的选项[foo]
可以很好地工作。可以使用替代品直接弄乱标签,绕过选项
/绝对选项
:
ListLogLogPlot[Range[20]^3, Frame -> True] /.
(FrameTicks -> x_) :>
(FrameTicks -> (x /. {a_?NumericQ, b_Integer, s___} :>
{a, Superscript[10, Log10@b], s} ))
多亏了这一点,它现在得到了改进,不再那么脆弱。将包含此代码的电子邮件发送到support@Wolfram.com. 他们将能够告诉您是否有更好的解决方法。与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]}}]
要补充Brett的,请查看中的CustomTicks
包。它提供了两个用于生成记号“LinTicks和
LogTicks”的函数,每个函数都有许多格式选项。目前,它要求您自己执行对数运算,即
Plot[ {Log[10,Cosh[x]], Log[10, Sinh[x]]}, {x, 0, 4}, Frame -> True,
FrameTicks -> { LinTicks, LogTicks, None, None }]
给予
对于数据列表,显然您必须将Log[Base,data]
与ListPlot
一起使用,但这是可行的。我已经向MarkCaprio提交了一个补丁,以便下面的补丁可以做与上面完全相同的事情
LogPlot[ {Cosh[x], Sinh[x]}, {x, 0, 4}, Frame -> True,
FrameTicks -> { LinTicks, LogTicks, None, None }]
如果接受修补程序,则可以通过将选项PlotType
设置为Linear
,对数
来访问旧形式的LogTicks
。使用CustomTicks
的优点是其他基础很简单
它会自动按照您的需要设置格式
Edit:我还想指出,
CustomTicks
可以自己加载,与LevelScheme
的其余部分分开。而且,由于它是一个小程序包,所以没有那么多额外的开销。是的,我在这里做了:在这里:,几小时前在这个问题上纯粹是偶然的:@Sjoerd为什么这不是一个答案,所以我可以投赞成票?@Mr.Wizard嗯,在我看来,这实际上并不是对Leo问题的回答,这与ListLogPlot中的错误有关。顺便说一句:我刚刚更新了上面提到的答案,加入了贝里萨里乌斯的新观点。新代码不太像黑客,但就我所见,它不适合于日志图。你还是要用老办法。另一件事:我想提请您注意我最后更新下面的一个不相关的警告。我不知道该怎么做,但我觉得这个警告应该被更广泛地了解。@Sjoerd我用了“关于如何处理这个问题的任何想法?”来为这个问题提供替代解决方案。我得看看我能不能对你的警告做点什么,它看起来很难看。非常优雅+1.但是我们应该小心使用它,因为这个技巧依赖于ListLogLogPlot
的版本依赖行为。我认为只要用{a_?NumericQ,b_Integer}
替换{a_?NumericQ,b_Integer,s_uuuuuu}
和{a,Superscript[10,Log10@b]}{a,上标[10,Log10@b],s}
@Alexey,请用它编辑我的答案,这样你的名字也会出现在答案上。请尽量保留格式。我已进行了编辑,但我没有足够的权限,编辑必须进行审阅。我不知道谁应该在制作时审查它。@Alexey不幸的是,编辑审查员不知道我们想要什么。我会自己编辑的。唯一的解决办法是让我投票支持你的问题,这样你很快就能达到2000名代表。:-)@西蒙,现在唯一的问题是你必须自己做对数运算。但幸运的是,这种情况不会持续太久。我抵制学习LevelScheme
已有多年了。今天使用CustomTicks
的良好体验可能最终会改变这一点。谢谢。@ArgentoSapiens,LevelScheme
需要适应,但是CustomTicks
是一个很棒的工具。