Yar*_*tov 34 wolfram-mathematica
给定Graphics对象,如何确定包含所有图形所需的坐标范围?基本上,我需要的东西像什么Show(默认设置),但我想说明PlotRange,PlotRangePadding并ImagePadding明确.
例如,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那样修复.总结一下
Show[g]明确的设置,没有办法重现上面的内容PlotRangeImagePadding使用Show[g]Show[g,PlotRange->Automatic] 看起来与众不同 Show[g]AbsoluteOptions可以给错误的结果为PlotRange我可以建议以下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
我有时也发现如何让 MathematicaGraphics以一致的方式显示很令人困惑,特别是在插入图形时。
对于指定的图形g,您为 提供什么并不重要PlotRange,因为Thickness[1]总是绘制一条粗细等于水平绘图范围的线。在您的示例中,Show[g, ___]给出了正确的结果:
。
Show[g],或者简单地说g,是异常的。
为什么?
我不知道在哪里/是否有记录,但这里有一些可能与该问题相关的内容。
显然DisplayForm[Graphics[___]]是一个栅格。
我们可以使用 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"]
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->_]。
这就是到目前为止我所发现的一切。