检索自动生成的绘图范围

时间:2012-01-16 00:36:00

标签: wolfram-mathematica

是否可以在Mathematica中检索自动生成的绘图范围?

例如,如果我这样做:

Plot[Sin[x], {x, 0, 2 \[Pi]}, PlotRange -> Automatic]

然后我想知道Y轴的范围是-1到1,X轴的范围是0到2 pi。

5 个答案:

答案 0 :(得分:15)

p = Plot[Sin[x], {x, 0, 2*Pi}, PlotRange -> Automatic];

AbsoluteOptions有点乐透,但在这种情况下适用

AbsoluteOptions[p, PlotRange]
{PlotRange -> {{0., 6.28319}, {-1., 1.}}}

即使AbsoluteOptions取代FullOptions,如果FullOptions失败,有时也值得尝试AbsoluteOptions,因为我遇到了AbsoluteOptions失败时遇到的情况但FullOptions有效。在这种情况下,FullOptions也有效:

FullOptions[p, PlotRange]
{{0., 6.28319}, {-1., 1.}}

答案 1 :(得分:3)

不漂亮或一般,但你可以蛮力这样:

p = Plot[Sin[x], {x, 0, 2*Pi}, PlotRange -> Automatic];
First@Cases[p, List[___, Rule[PlotRange, x_], ___] -> x]

{{0., 6.28319}, {-1., 1.}}

您可以通过查看FullForm[p]

来解决这个问题

答案 2 :(得分:2)

使用AbsoluteOptions功能,q。 v。在文档中。

In[56]:= x = Plot[Sin[x], {x, 0, 2 \[Pi]}, PlotRange -> Automatic];
         AbsoluteOptions[x, PlotRange]

Out[57]= {PlotRange -> {{0., 6.28319}, {-1., 1.}}}

答案 3 :(得分:2)

我可以建议以下Ticks hack:

pl = Plot[Sin[x], {x, 0, 10}];
Reap[Rasterize[Show[pl, Ticks -> {Sow[{##}] &, Sow[{##}] &}], 
   ImageResolution -> 1]][[2, 1]]

=> {{-0.208333, 10.2083}, {-1.04167, 1.04167}} 

诀窍是真正的PlotRange由FrontEnd决定,而不是由内核决定。所以我们必须强制FrontEnd渲染图形,以便评估滴答函数。此hack会为完整的PlotRange添加明确的PlotRangePadding值。

考虑到pl具有DisplayFinction选项的非标准值且可能Axes选项设置为False的可能性的更一般的解决方案:

completePlotRange[plot_] := 
 Last@Last@
   Reap[Rasterize[
     Show[plot, Ticks -> (Sow[{##}] &), Axes -> True, 
      DisplayFunction -> Identity], ImageResolution -> 1]]

在“更多信息”下的PlotRange文档页面上,可以阅读有关AbsoluteOptions的重要说明:“AbsoluteOptions提供PlotRange规范的明确形式< strong>当Automatic设置被赋予时“(突出显示是我的)。因此,当AbsoluteOptions所有坐标都不是PlotRange时,文档似乎无法保证Automatic会为{{1}}提供正确的值。

答案 4 :(得分:1)

与acl一样,我经常深入研究FullForm with Position to post-process graphics:

E.g。查找和修改PlotRange:

p = Plot[Sin[x], {x, 0, 2 \[Pi]}, PlotRange -> Automatic];
rpos = Position[p, PlotRange];
Print["Initial PlotRange"];
p[[Sequence @@ Most[First[rpos]]]]
Print["Modified PlotRange"];
p[[Sequence @@ Most[First[rpos]]]] = PlotRange -> {{0, Pi}, {-1, 1}}
Print[p]

或者,修改颜色:

p = Plot[{Sin[x], Cos[x]}, {x, 0, 2 \[Pi]}, PlotRange -> Automatic];
hpos = Position[p, Hue];
Print["Initial colours"]
p[[Sequence @@ Most[#]]] & /@ hpos
Print["New colours"]
MapThread[(p[[Sequence @@ Most[#1]]] = #2) &, {hpos, {Green, Orange}}]
Print[p]