如何确定PlotRange包含所有图形?

Yar*_*tov 34 wolfram-mathematica

给定Graphics对象,如何确定包含所有图形所需的坐标范围?基本上,我需要的东西像什么Show(默认设置),但我想说明PlotRange,PlotRangePaddingImagePadding明确.

例如,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]]
Run Code Online (Sandbox Code Playgroud)

动机:在这个问题中修复图表

更新: AbsoluteOptions给我PlotRange但不是其他两个选项.默认情况下,明确指定ImagePadding->Automatic更改外观Automatic.

下面的两张图片显示不同,我不明白为什么

g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}];
Show[g]
Show[g, Sequence @@ AbsoluteOptions[Show[g]]]
Run Code Online (Sandbox Code Playgroud)

更新2:一年前提出了类似的问题,没有提出解决方案,也没有像Mathematica 8.0那样修复.总结一下

  1. Show[g]明确的设置,没有办法重现上面的内容PlotRange
  2. 没有办法绝对ImagePadding使用Show[g]
  3. Show[g,PlotRange->Automatic] 看起来与众不同 Show[g]
  4. AbsoluteOptions可以给错误的结果PlotRange

Ale*_*kov 5

我可以建议以下Ticks黑客:

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}} 
Run Code Online (Sandbox Code Playgroud)

诀窍是,real PlotRange是由FrontEnd决定的,而不是由内核决定的.所以我们必须强制FrontEnd渲染图形,以便评估滴答函数.这个hack为完整版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]]
Run Code Online (Sandbox Code Playgroud)

通过以下功能可以获得准确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]]
Run Code Online (Sandbox Code Playgroud)

PS在PlotRange"更多信息"下的" 文档"页面上,可以读取:" AbsoluteOptions给出设置给定的设置为或者,Mathematica 内部使用的选项的实际设置."(强调我的).因此,似乎文档甚至不保证在没有或没有时给出正确的值.AutomaticAllAbsoluteOptionsPlotRangeAutomaticAll


JxB*_*JxB 3

我有时也发现如何让 MathematicaGraphics以一致的方式显示很令人困惑,特别是在插入图形时。

对于指定的图形g,您为 提供什么并不重要PlotRange,因为Thickness[1]总是绘制一条粗细等于水平绘图范围的线。在您的示例中,Show[g, ___]给出了正确的结果:

自动图像填充

Show[g],或者简单地说g,是异常的。

为什么?

我不知道在哪里/是否有记录,但这里有一些可能与该问题相关的内容。

  1. 显然DisplayForm[Graphics[___]]是一个栅格。

  2. 我们可以使用 Rasterize[g] 获取 g 的栅格。什么是光栅尺寸?经过反复试验,我发现 RasterSize 是 10 * 屏幕分辨率(在我的系统上报告为每英寸 72 像素)。我怎么知道这个?如果我使用小于 718 的分辨率对 g 进行栅格化,我会得到尺寸为 {360,361} 的图像,而我的系统上 g 的默认图像大小为 360 像素,因此我打算 Show[] 一个图形,Mathematica 的放大Rasterize倍数为 10x屏幕分辨率。有人知道这是真的吗?您可以从选项检查器中获取屏幕分辨率(至少在 Mathematica 中是这样的)。 编辑 以下表达式的计算结果似乎True表明显示的图形以 ImageSize 光栅化: ImportString[ExportString[Show[g,ImageSize->100],"PNG"]] === ImportString[ExportString[Rasterize[g,RasterSize->100,ImageSize->100],"PNG"]

  3. Show[g]要在使用时重现PlotRange我需要使用 Show[g,PlotRange->{{0,1},{0,1}},ImagePadding->90.3]

特定图像填充

让它裁剪到线的周边。所以看起来Mathematica在使用时说的PlotRange{{0,1},{0,1}}事实AbsoluteOptions[]。它没有报告 的实际值ImagePadding。也许ImagePadding->Automatic是因为基于使用当前ImageSize、、PlotRangeClipping...设置的规则?90.3的ImagePadding仅适用于ImageSize->360; 设置ImageSize->200使ImagePadding值错误。对于您的图形,在我的系统上ImagePadding->90.3*OptionValue[ImageSize]/360复制Show[g,ImageSize->_]

这就是到目前为止我所发现的一切。