2011-03-23 21 views
9

¿Es posible hacer zoom en una región y mostrarla como una subtrama dentro de la misma parcela? Aquí está mi primitivo intento de gráficos a mano alzada, para ilustrar mi pregunta:Zoom de región y visualización como una subtrama dentro de la gráfica

enter image description here

puedo pensar en usar Plot, y luego Epilog, pero luego se pierden en el posicionamiento y en dar la trama su propio origen (Cuando intento Epilog en Plot, la nueva gráfica se ubica encima de la anterior, usando el origen del anterior).

Además, sería bueno si se puede ingresar el posicionamiento de la subparcela, ya que las diferentes curvas tienen diferentes "regiones vacías" que se pueden usar para posicionar la imagen.

Lo he visto en varios artículos y puedo hacerlo en MATLAB, pero no tengo ni idea de cómo hacerlo en mma.

+2

Tal vez esto le interese http://web.ift.uib.no/~szhorvat/mmatricks.php mira la sección de zoom –

+0

vínculo roto : web.ift.uib.no/~szhorvat/mmatricks.php –

Respuesta

6

Uso de la inserción. He aquí un ejemplo:

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

+0

+1 _Desde la versión 4.0 (lanzada en 1999), FullOptions ha sido reemplazado por AbsoluteOptions_. : D –

+0

Por lo demás, me pregunto por qué no utilicé solo las Opciones. Los viejos hábitos mueren lentamente, supongo. –

+0

Buen ejemplo!Pero es probable que sea mejor usar 'Prolog' en lugar de' Epilog' en tales casos para no superponer el gráfico original. –

4

Sólo un arranque rápido:

imgsz = 400; 
f[x_] := Piecewise[{{[email protected], [email protected] > .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

6

Y, préstamos de belisarius' code, también puede seleccionar el foco de su inserción interactiva mediante la selección de una posición en el eje x:

imgsz = 400; 
f[x_] := Piecewise[{{[email protected], [email protected] > .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}] 

o, si también desea colocar el recuadro de forma interactiva:

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}] 

EDITAR

una alternativa más en base a la pregunta de dbjohn:

imgsz = 400; 
f[x_] := Piecewise[{{[email protected], [email protected] > .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

+0

+1 buena solución. @Sjoerd C. de Vries Utilicé esto y noté que mover el recuadro y luego hacer clic en el gráfico "saltará" el recuadro cuando realmente desee que cambie el foco del recuadro x, es decir, que algunas veces se mezclen. ¿Alguna mejora sugerida para solucionar esto? Tal vez un segundo localizador ... – dbjohn

+1

@dbjohn Sí, lo noté también. El clic siempre va al localizador más cercano. Esto puede significar que al hacer clic en la curva se puede mover la ventana de acercamiento si estaba más cerca que el punto en la curva que amplió previamente. Pensé en usar teclas modificadoras (Ctrl + clic, etc.) pero eso lo haría más complejo de lo que estaba preparado para hacer por el momento. Otra solución podría ser un control deslizante 2D para seleccionar la posición de la ventana de zoom. –

2

eso me parece un área en la necesidad de una mejor construida en herramientas. He estado trabajando en esta solución basada en una demostración here. Prefiero tener la imagen ampliada y la imagen sin zoom separadas y como un bono agregué un área presentable donde se podían poner texto o ecuaciones relevantes. Para diferentes funciones, la relación de aspecto puede necesitar ser ajustada manualmente.

(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[{{[email protected], [email protected] > .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

Cuestiones relacionadas