是否可以在Mathematica中检索自动生成的绘图范围?
例如,如果我这样做:
Plot[Sin[x], {x, 0, 2 \[Pi]}, PlotRange -> Automatic]
然后我想知道Y轴的范围是-1到1,X轴的范围是0到2 pi。
答案 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]