Wolfram mathematica ListLogPlot勾号标签中的强制科学符号

Wolfram mathematica ListLogPlot勾号标签中的强制科学符号,wolfram-mathematica,Wolfram Mathematica,我正在尝试自定义ListLogPlot上的勾号标签格式。通过搜索Mathgroup归档文件,处理记号标签的通常方法似乎是使用AbsoluteOptions提取记号标签,使用自定义格式运行替换规则,然后使用Ticks->{…}选项显式将记号标签提供给绘图函数。但是,以下内容不适用于ListLogPlot: foo = ListLogLogPlot[Range[20]^3, Frame -> True]; ticks=(FrameTicks /. AbsoluteOptions[foo, Fr

我正在尝试自定义ListLogPlot上的勾号标签格式。通过搜索Mathgroup归档文件,处理记号标签的通常方法似乎是使用
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
是一个很棒的工具。