给定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]]
动机:修复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 内部使用的选项的实际设置,当给定的设置是Automatic
或All
时。”(重点是我的)。因此,似乎文档甚至不能保证AbsoluteOptions
不是PlotRange
或Automatic
时,都会为All
提供正确的值。关于wolfram-mathematica - 如何确定PlotRange包含所有图形?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4288713/