给定Graphics对象,如何确定包括所有图形所需的坐标范围?基本上,我需要类似Show的默认设置,但是我想显式指定PlotRangePlotRangePaddingImagePadding

例如,下面的两个Show应该呈现相同的

g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}];
Show[g]
Show[g, PlotRange -> getPlotRange[g], PlotRangePadding->getPlotRangePadding[g], ImagePadding->getImagePadding[g]]

动机:修复this问题中的图表

更新:AbsoluteOptions给我PlotRange,但没有其他两个选项。明确指定ImagePadding->Automatic会更改外观,尽管默认情况下据说是Automatic

下面的两个图像显示不同,我不明白为什么
g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}];
Show[g]
Show[g, Sequence @@ AbsoluteOptions[Show[g]]]

更新2:
类似的问题是一年前的brought up,没有提出解决方案,并且从Mathematica 8.0开始还没有解决。总结一下
  • 无法通过显式设置Show[g]来复制上面的PlotRange
  • 无法获得ImagePadding使用的绝对Show[g]
  • Show[g,PlotRange->Automatic]看起来与Show[g]
  • 不同
  • AbsoluteOptions可以为PlotRange提供wrong result
  • 最佳答案

    我可以建议以下Ticks hack:

    pl = Plot[Sin[x], {x, 0, 10}];
    Reap[Rasterize[Show[pl, Ticks -> {Sow[{##}] &, Sow[{##}] &}, ImageSize -> 0],
       ImageResolution -> 1]][[2, 1]]
    
    => {{-0.208333, 10.2083}, {-1.04167, 1.04167}}
    

    诀窍在于,真正的PlotRange是由FrontEnd而不是内核确定的。因此,我们必须强制FrontEnd渲染图形才能评估刻度函数。该技巧提供了完整的PlotRange,并添加了PlotRangePadding的显式值。

    考虑到pl具有DisplayFinction选项的非标准值以及可能将Axes选项设置为False的可能性的更通用的解决方案:
    completePlotRange[plot:(_Graphics|_Graphics3D|_Graph)] :=
     Quiet@Last@
       Last@Reap[
         Rasterize[
          Show[plot, Axes -> True, Frame -> False, Ticks -> (Sow[{##}] &),
           DisplayFunction -> Identity, ImageSize -> 0], ImageResolution -> 1]]
    

    可以使用以下功能获取确切的PlotRange(不添加PlotRangePadding):
    plotRange[plot : (_Graphics | _Graphics3D | _Graph)] :=
     Quiet@Last@
       Last@Reap[
         Rasterize[
          Show[plot, PlotRangePadding -> None, Axes -> True, Frame -> False,
           Ticks -> (Sow[{##}] &), DisplayFunction -> Identity, ImageSize -> 0],
          ImageResolution -> 1]]
    

    附言在PlotRange的“文档”页面上的“更多信息”下,您可以阅读:“AbsoluteOptions给出了Mathematica 内部使用的选项的实际设置,当给定的设置是AutomaticAll 时。”(重点是我的)。因此,似乎文档甚至不能保证AbsoluteOptions不是PlotRangeAutomatic时,都会为All提供正确的值。

    关于wolfram-mathematica - 如何确定PlotRange包含所有图形?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4288713/

    10-10 16:23