缩放区域并显示为图中的子图

时间:2011-03-23 23:31:21

标签: wolfram-mathematica

是否可以放大区域并将其显示为同一图中的子图?这是我对写意图形的原始尝试,以说明我的问题:

enter image description here

我可以考虑使用Plot,然后使用Epilog,但后来我迷失了定位并给出了情节的原点(当我尝试Epilog Plot时1}},新的情节位于旧情节的顶部,使用旧的情节。

此外,如果可以输入子图的位置会很好,因为不同的曲线具有可用于定位图像的不同“空区域”。

我在几篇文章中已经看过这个,我可以在MATLAB中做到这一点,但我不知道如何在mma中做到这一点。

4 个答案:

答案 0 :(得分:6)

使用Inset。这是一个例子:

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

答案 1 :(得分:6)

而且,借用belisarius' code,您还可以通过选择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

答案 2 :(得分:5)

只是一个kickstart:

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

答案 3 :(得分:2)

我觉得这个领域需要更好的内置工具。我一直在根据演示here开发此解决方案。我更喜欢将缩放的图像和未图像的图像分开,作为奖励,我添加了一个可以放置相关文本或方程式的可呈现区域。对于不同的功能,可能需要手动调整宽高比。

(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