Масштабирование области и отображение в качестве вспомогательного участка на графике - PullRequest
9 голосов
/ 24 марта 2011

Можно ли увеличить масштаб региона и отобразить его в качестве вспомогательного участка на том же графике? Вот моя примитивная попытка рисовать от руки, чтобы проиллюстрировать мой вопрос:

enter image description here

Я могу подумать об использовании Plot, а затем Epilog, но тогда я теряюсь в позиционировании и в предоставлении сюжета его собственного происхождения (Когда я пытаюсь Epilog на Plot, новый график лежит поверх старого, используя происхождение старого).

Кроме того, было бы неплохо, если бы можно было ввести позиционирование подплота, поскольку разные кривые имеют разные «пустые области», которые можно использовать для позиционирования изображения.

Я видел это в нескольких статьях, и я могу сделать это в MATLAB, но я понятия не имею, как это сделать в MMA.

Ответы [ 4 ]

6 голосов
/ 24 марта 2011

Использовать вставку. Вот пример:

f[x_] = Sum[Sin[3^n x]/2^n, {n, 0, 20}];
x1 = x /. FindRoot[f[x] == -1, {x, -2.1}];
x2 = x /. FindRoot[f[x] == -1, {x, -1.1, -1}];
g = Plot[f[x], {x, x1, x2}, AspectRatio -> Automatic,
   Axes -> False, Frame -> True, FrameTicks -> None];
{y1, y2} = Last[PlotRange /. FullOptions[g]];
Plot[Sum[Sin[3^n x]/2^n, {n, 0, 20}], {x, -Pi, Pi},
 Epilog -> {Line[{
     {{x2, y2 + 0.1}, {-0.5, 0.5}}, {{x1, y2 + 0.1}, {-3.5, 0.5}},
     {{x1, y1}, {x2, y1}, {x2, y2 + 0.1}, {x1, y2 + 0.1}, {x1, 
       y1}}}],
   Inset[g, {-0.5, 0.5}, {Right, Bottom}, 3]},
 PlotRange -> {{-4, 4}, {-3, 3}}, AspectRatio -> Automatic]

Mathematica graphics

6 голосов
/ 24 марта 2011

И, заимствуя из код Велизария , вы также можете выбрать фокус вашей вставки в интерактивном режиме , выбрав позицию на оси x:

imgsz = 400;
f[x_] := Piecewise[{{Sin@x, Abs@x > .1}, {Sin[100 x], Abs[x] <= 0.1}}];

Manipulate[
 Plot[f[x], {x, -3, 3}, PlotRange -> {{-3, 3}, {-2, 5}}, 
  ImageSize -> imgsz, 
  Epilog -> 
   Inset[Plot[f[y], {y, p[[1]] - .3, p[[1]] + 0.3}, PlotStyle -> Red, 
     Axes -> False, Frame -> True, ImageSize -> imgsz/3], {1.5, 3}]],
 {{p, {0, 0}}, Locator, Appearance -> None}]

или, если вы также хотите разместить вкладку в интерактивном режиме:

Manipulate[
 Plot[f[x], {x, -3, 3}, PlotRange -> {{-3, 3}, {-2, 5}}, 
  ImageSize -> imgsz, 
  Epilog -> 
   Inset[Plot[f[y], {y, p[[1, 1]] - .3, p[[1, 1]] + 0.3}, 
     PlotStyle -> Red, Axes -> False, Frame -> True, 
     ImageSize -> imgsz/3], p[[2]]]],
 {{p, {{0, 0}, {1.5, 3}}}, Locator, Appearance -> None}]

РЕДАКТИРОВАТЬ

еще одна альтернатива, основанная на вопросе dbjohn:

imgsz = 400;
f[x_] := Piecewise[{{Sin@x, Abs@x > .1}, {Sin[100 x], Abs[x] <= 0.1}}];

Manipulate[
 Plot[f[x], {x, -3, 3}, PlotRange -> {{-3, 3}, {-2, 5}}, 
  ImageSize -> imgsz, 
  Epilog -> 
   Inset[Plot[f[y], {y, p[[1]] - .3, p[[1]] + 0.3}, PlotStyle -> Red, 
     Axes -> False, Frame -> True, ImageSize -> imgsz/3], 
    Scaled[zw]]], {{p, {0, 0}}, Locator, 
  Appearance -> None}, {{zw, {0.5, 0.5}, "Zoom window"}, Slider2D}]

enter image description here

5 голосов
/ 24 марта 2011

Просто кикстарт:

imgsz = 400;
f[x_] := Piecewise[{{Sin@x, Abs@x > .1}, {Sin[100 x], Abs[x] <= 0.1}}];

Plot[f[x], {x, -3, 3}, PlotRange -> {{-5, 5}, {-5, 5}}, 
 ImageSize -> imgsz, Epilog ->
  Inset[Plot[f[y], {y, -.3, 0.3}, PlotStyle -> Red, Axes -> False, 
    Frame -> True, ImageSize -> imgsz/3], {3, 3}]]  

enter image description here

2 голосов
/ 09 апреля 2011

Я считаю эту область нуждающейся в лучших встроенных инструментах.Я работал над этим решением на основе демоверсии здесь .Я предпочитаю разделять увеличенное изображение и увеличенное изображение, и в качестве бонуса я добавил презентабельную область, в которую можно поместить соответствующий текст или уравнения.Для различных функций соотношение сторон может потребоваться настроить вручную.

(f[x_] := x^2;
 ; xMin = -5; yMin = -5; xMax = 5; yMax = 5; 
 Manipulate[
  Grid[{{LocatorPane[{a}, 
      Plot[f[x], {x, xMin, xMax}, 
       PlotRange -> {{xMin, xMax }, {yMin, yMax}}, 
       ImageSize -> Medium, AspectRatio -> 1, AxesOrigin -> {0, 0}]], 
     Plot[f[x], {x, (a[[1]]) + xMin*mag, (a[[1]]) + xMax*mag}, 
      PlotRange -> {{(a[[1]]) + xMin*mag, (a[[1]]) + 
          xMax*mag}, {(a[[2]]) + yMin*mag, (a[[2]]) + yMax*mag}}, 
      ImageSize -> Medium, AspectRatio -> 1, AxesOrigin -> {0, 0}], 
     Item[StringForm["This is a suitable area to put any text.
       Value of A is :
       `1` ", a], Alignment -> {Left, Top}]}}, Frame -> All, 
   ItemSize -> All, 
   Spacings -> 5], {{a, {0, 0}}, {xMin, yMin}, {xMax, yMax}, Locator, 
   Appearance -> 
    Graphics[{Yellow, Opacity[.2], 
      Rectangle[Scaled[{.5 - (mag/2), .5 - (mag/2)}], 
       Scaled[{.5 + (mag/2), .5 + (mag/2)}]]}]}, {{mag, .5, 
    "Magnification"}, 0.01, 1, Appearance -> "Labeled"}])

enter image description here

(f[x_] := 
   Piecewise[{{Sin@x, Abs@x > .1}, {Sin[100 x], Abs[x] <= 0.1}}];
 ; xMin = -3; yMin = -3; xMax = 3; yMax = 3; 
 Manipulate[
  Grid[{{LocatorPane[{a}, 
      Plot[f[x], {x, xMin, xMax}, 
       PlotRange -> {{xMin, xMax }, {yMin, yMax}}, 
       ImageSize -> Medium, AspectRatio -> 1, AxesOrigin -> {0, 0}]], 
     Plot[f[x], {x, (a[[1]]) + xMin*mag, (a[[1]]) + xMax*mag}, 
      PlotRange -> {(*{(a[[1]])+xMin*mag,(a[[1]])+xMax*
        mag},*){(a[[2]]) + yMin*mag, (a[[2]]) + yMax*mag}}, 
      ImageSize -> Medium, AspectRatio -> 1, AxesOrigin -> {0, 0}, 
      Frame -> True], 
     Item[StringForm["This is a suitable area to put any text.
       Value of A is :
       `1` ", a], Alignment -> {Left, Top}]}}, Frame -> All, 
   ItemSize -> All, 
   Spacings -> 5], {{a, {0, 0}}, {xMin, yMin}, {xMax, yMax}, Locator, 
   Appearance -> 
    Graphics[{Yellow, Opacity[.2], 
      Rectangle[Scaled[{.5 - (mag/2), .5 - (mag/2)}], 
       Scaled[{.5 + (mag/2), .5 + (mag/2)}]]}]}, {{mag, .06, 
    "Magnification"}, 0.01, 1, Appearance -> "Labeled"}])

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...