Wolfram mathematica 如何确定PlotRange以包含所有图形?
给定Wolfram mathematica 如何确定PlotRange以包含所有图形?,wolfram-mathematica,Wolfram Mathematica,给定图形对象,如何确定包含所有图形所需的坐标范围?基本上,我需要类似于默认情况下Show所做的操作,但我希望明确指定PlotRange、PlotRangePadding和ImagePadding 例如,下面的两个Shows应该呈现相同的效果 g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}]; Show[g] Show[g, PlotRange -> getPlotRange[g], PlotRang
图形
对象,如何确定包含所有图形所需的坐标范围?基本上,我需要类似于默认情况下Show
所做的操作,但我希望明确指定PlotRange
、PlotRangePadding
和ImagePadding
例如,下面的两个Show
s应该呈现相同的效果
g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}];
Show[g]
Show[g, PlotRange -> getPlotRange[g], PlotRangePadding->getPlotRangePadding[g], ImagePadding->getImagePadding[g]]
动机:修复有问题的图表
更新:
AbsoluteOptions
提供了PlotRange
但没有其他两个选项。明确指定ImagePadding->Automatic
会更改外观,尽管默认情况下它是自动的
下面的两张图片显示的不同,我不明白为什么
g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}];
Show[g]
Show[g, Sequence @@ AbsoluteOptions[Show[g]]]
更新2:
一年前有一个类似的问题,没有提出解决方案,从Mathematica 8.0开始就没有解决。概括
使用显式设置PlotRange
无法获得Show[g]
Show[g,PlotRange->Automatic]
与Show[g]
AbsoluteOptions
可以为PlotRange
一、 同样,有时也会发现如何让Mathematica以一致的方式显示图形
,尤其是在插入图形时,这让人感到困惑
对于指定的图形g
,为绘图范围提供什么并不重要,因为厚度[1]
始终绘制厚度等于水平绘图范围的线。在您的示例中,Show[g,
给出了正确的结果:
Show[g]
,或者干脆g
,是不正常的
为什么?
我不知道在哪里/是否有记录,但这里有一些事情可能与这个问题有关
显然,DisplayForm[Graphics[_;]]
是一个光栅
我们可以使用光栅化[g]得到g的光栅。光栅的大小是多少?从试验到试验
错误,我发现RasterSize是10*屏幕分辨率(在我的系统上报告为每英寸72像素)。我怎么知道的?如果我用小于718的分辨率对g进行光栅化,我会得到一个尺寸为{360361}的图像,而在我的系统上g的默认图像大小是360像素,因此我想显示[]一个图形,Mathematica将其光栅化为屏幕分辨率的10倍。有人知道这是不是真的吗?您可以从选项检查器获得屏幕分辨率(至少在Mathematica看来是这样)。
编辑
以下表达式的计算结果为True
似乎表明所显示的图形已按ImageSize光栅化:
ImportString[ExportString[Show[g,ImageSize->100],“PNG”]
===ImportString[ExportString[光栅化[g,光栅大小->100,图像大小->100],“PNG”]
要在使用PlotRange
时再现Show[g]
,我需要使用
Show[g,PlotRange->{{0,1},{0,1},ImagePadding->90.3]
因此,Mathematica在使用AbsoluteOptions[]
。它没有报告ImagePadding
的实际值。可能是因为ImagePadding->Automatic
基于使用当前ImageSize
,PlotRangeClipping
,…设置的规则。90.3的ImagePadding
仅适用于ImageSize->360
;设置ImageSize->200
使ImagePadding
值出错。对于您的图形,ImagePadding->90.3*OptionValue[ImageSize]/360
在我的系统上复制显示[g,ImageSize->
到目前为止,我只发现了这些。您可以尝试在已知位置添加一个可识别的对象,然后查看它在导出版本中的显示位置,以提供比例参考。我认为向量导出(SVG或EPS)更容易解析,但我认为在播放一段时间后,光栅更容易解析
例如,添加一个覆盖理论打印范围的绿色矩形:
g = Graphics[{Blue, Thickness[1], CapForm["Round"],
Line[{{0, 0}, {1, 1}}], Green, Rectangle[{0, 0}, {1, 1}]}];
代码基本上是识别所有绿色像素的位置。
本例中的填充为{92,92},{92,92},但它不一定是对称的。我可以建议以下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
是由前端决定的,而不是由内核决定的。因此,我们必须强制前端渲染图形,以便对勾号函数进行评估。这种方法提供了完整的PlotRange
,并添加了显式值PlotRangePadding
更一般的解决方案考虑到pl
具有DisplayFinction
选项的非标准值,并且可能将轴
选项设置为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内部使用的选项的实际设置,当给定的设置为自动
或全部
”(强调我)。因此,文档似乎甚至不能保证绝对选项
在非自动
或所有
时会为绘图范围
提供正确的值。我也在玩绝对选项,但有时它会返回错误的值是的……也许我最好实现自己的粗线条…Seems这个问题不是新问题,似乎是来自MathGroup存档,我得到的行为与Mathematica 8JxB中报告的相同,发布您图像的imgurl地址,我
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]]