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]]