Получение автоматически сгенерированного диапазона графика - PullRequest
9 голосов
/ 16 января 2012

Возможно ли получить автоматически сгенерированный диапазон графика в Mathematica?

Например, если бы я должен был сделать:

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

тогда я хотел бы знать, что диапазон оси Y был от -1 до 1, а диапазон оси X был от 0 до 2 пи.

Ответы [ 5 ]

15 голосов
/ 16 января 2012
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.}}
3 голосов
/ 16 января 2012

Не красиво или вообще, но вы можете переборщить это так:

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 голосов
/ 21 января 2012

Я могу предложить следующий Ticks хак:

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 визуализировать графику, чтобы оценить функции тиков.Этот хак дает полный 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 спецификаций при Automaticнастройки даны"(подсветка моя).Таким образом, кажется, что Документация не гарантирует, что AbsoluteOptions даст правильные значения для PlotRange, когда это не Automatic для всех координат.

2 голосов
/ 16 января 2012

Используйте функцию 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.}}}
1 голос
/ 16 января 2012

Как и acl, я часто копаюсь в FullForm с Position для пост-обработки графики:

например. Поиск и изменение 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...