【问题标题】:Exponential form of tick marks for log plot in MathematicaMathematica 中对数图刻度线的指数形式
【发布时间】:2011-10-22 14:57:08
【问题描述】:

为了了解更多 Mathematica,我正在尝试重现此 log (log) plot 上的刻度线:

这是我能得到的最接近的:

LogLogPlot[Log[x!], {x, 1, 10^5}, PlotRange -> {{0, 10^5}, {10^-1, 10^6}}, Ticks -> {Table[10^i, {i, 0, 5}], Table[10^i, {i, -1, 6}]}]

问题

对于适当的 n 值,如何制作始终为 10^n 形式的刻度线?

【问题讨论】:

    标签: logging plot wolfram-mathematica


    【解决方案1】:

    Superscript,没有任何内置含义的通用排版形式,是你的朋友。

    LogLogPlot[Log[x!], {x, 1, 10^5}, 
       PlotRange -> {{0, 10^5}, {10^-1, 10^6}}, 
       Ticks -> {
           Table[{10^i, Superscript[10, i]}, {i, 0, 5}], 
           Table[{10^i, Superscript[10, i]}, {i, -1, 6}]
           }
       ]
    

    【讨论】:

    • 在这个繁忙的会议周之后,您应该度过一个轻松的周末!昨天我找不到你说再见。我被邀请共进晚餐。
    • 谢谢!我知道 Superscript[],但我不认为将值 10^i 与其表示 Superscript[10,i] 配对。
    • @Sjoerd 好吧,至少我是在家里检查 SO,而不是在访问外国时。 ;-)(我知道,必须保持连续的天数..)
    【解决方案2】:

    要扩展之前的答案,您可以通过执行类似的操作自动计算 Tables 中 Ticks 选项的正确范围

    ticksfun[xmin_, xmax_] := 
     Table[{10^i, Superscript[10, i]}, {i, Floor[Log10[xmin]], 
       Ceiling[Log10[xmax]]}]
    
    LogLogPlot[Log[x!], {x, 1, 10^5}, 
     PlotRange -> {{0, 10^5}, {10^-1, 10^6}}, 
     Ticks -> {ticksfun, ticksfun}]
    

    【讨论】:

      【解决方案3】:

      LevelScheme 是 Mathematica 的一个软件包,它使绘制此类图变得非常容易、完全可定制且具有专业外观。我非常确定,如果您的绘图是用数学制作的,那么它使用的是 LevelScheme。这是我在 Mathematica 中使用LevelScheme复制你的情节@

      <<LevelScheme`;
      Figure[{
          FigurePanel[{{0,1},{0,1}},
                  PlotRange->{{0,5},{-1,6}},
                  FrameTicks->{
                              LogTicks[0,5,ShowMinorTicks->False],
                              LogTicks[-1,6,ShowMinorTicks->False]
                          }
          ],
          RawGraphics[
              LogLogPlot[{Log[x!],x Log[x]-x},{x,1,10^5},
                      PlotRange->{{0,10^5},{10^-1,10^6}},
                      PlotStyle->Darker/@{Red,Green}
                  ]
          ]
      }, PlotRange->{{-0.1,1.04},{-0.05,1.025}},ImageSize->300{1,1}]
      

      【讨论】:

      • 我不得不承认我还没有开始使用 LevelScheme(除了一些情节),但是明确的 PlotRange-&gt;{{-0.1,1.04},{-0.05,1.025}} 看起来真的很讨厌。这是在使用 Mathematica 图形时很烦人的事情。有没有办法解决它,只显示完整的绘图区域(已经由框架定义)?
      • @Szabolcs 我还没有研究 LevelScheme 的内部结构,看看他们是如何处理它的。但是,我认为明确定义事物的需求是 LevelScheme 的设计。我不将它用于快速绘图或当我仍在处理绘图时。我只在论文的最后阶段使用它,并花时间让它看起来很漂亮。它将图形视为从{0,0}{1,1} 的正方形,并且从中进行调整以适应刻度线。但你是对的:应该有一个Automatic 选项来捕捉到最外面的非白色像素是合乎逻辑的。
      • 不确定这是否是一项微不足道的任务,因为最外面的像素将取决于ImageSize 中使用的纵横比,我记得这里有一个答案试图猜测大小以适合Rasterizeing 它,找到极端,等等。但肯定要考虑一下
      • @Szabolcs 顺便说一句,将 LevelScheme 与 2D 图形(ArrayPlotDensityPlot 等)一起使用非常麻烦且经常出错。如果在边界框内,它会将图像直接覆盖在图形的顶部,这使得更难以进行更精细的控制......
      【解决方案4】:

      您可以通过提供{value, label} 的二元组而不是仅提供value 来指定给定刻度的标签。

      这仍然给我们留下了如何维护10^n-form 的难题。 为此,我们观察到,使用Defer 会使10^i 保留其形式。但是,我们仍然需要Evaluatei,否则我们只会得到一堆10^i-labels。

      例子:

      In[19]:= Table[10^i, {i, 0, 6}]
      
      Out[19]= {1, 10, 100, 1000, 10000, 100000, 1000000}
      
      In[18]:= Table[10^Defer[i], {i, 0, 6}]
      
      Out[18]= {10^i, 10^i, 10^i, 10^i, 10^i, 10^i, 10^i}
      
      In[17]:= Table[10^Defer[Evaluate[i]], {i, 0, 6}]
      
      Out[17]= {10^0, 10^1, 10^2, 10^3, 10^4, 10^5, 10^6}
      

      使用它,我们现在可以执行以下操作来获得解决方案:

      LogLogPlot[Log[x!], {x, 1, 10^5}, 
       PlotRange -> {{0, 10^5}, {10^-1, 10^6}}, 
       Ticks -> {Table[{10^i, 10^Defer[Evaluate [i]]}, {i, 0, 5}], 
         Table[{10^i, 10^Defer[Evaluate [i]]}, {i, -1, 6}]}, 
       TicksStyle -> StandardForm]
      

      【讨论】:

      • 这是由于TicksStyle -&gt; StandardForm。你也可以考虑HoldForm 而不是Defer(它的行为更复杂)。
      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 2020-10-08
      • 1970-01-01
      相关资源
      最近更新 更多