2011-03-23 19 views
9

के भीतर एक सबप्लॉट के रूप में प्रदर्शित करें क्या एक क्षेत्र में ज़ूम करना और एक ही प्लॉट के भीतर इसे सबप्लॉट के रूप में प्रदर्शित करना संभव है? यहाँ मेरी मुक्तहस्त ग्राफिक्स पर आदिम प्रयास, मेरे सवाल का वर्णन करने के लिए है:ज़ूम क्षेत्र और साजिश

enter image description here

मैं Plot, और फिर Epilog का उपयोग कर के बारे में सोच सकते हैं, लेकिन फिर मैं स्थिति में और साजिश का अपना मूल देने में खो (जब मैं पर Plot पर कोशिश करता हूं, तो पुरानी साजिश पुराने की उत्पत्ति का उपयोग करते हुए, पुराने प्लॉट के ऊपर होती है)।

इसके अलावा, यह अच्छा होगा अगर सबप्लॉट की स्थिति इनपुट हो सकती है, क्योंकि अलग-अलग घटता के अलग-अलग "रिक्त क्षेत्र" होते हैं जिनका उपयोग छवि को स्थानांतरित करने के लिए किया जा सकता है।

मैंने इसे कई लेखों में देखा है और मैं इसे MATLAB में कर सकता हूं, लेकिन मुझे कोई संकेत नहीं है कि यह एमएमए में कैसे करें।

+2

शायद यह हित होगा आप http://web.ift.uib.no/~szhorvat/mmatricks.php ज़ूमिंग अनुभाग –

+0

मृत लिंक को देखो : web.ift.uib.no/~szhorvat/mmatricks.php –

उत्तर

6

उपयोग इनसेट। यहाँ एक उदाहरण है:

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 _Since संस्करण 4.0 (1 999 में जारी), फुलऑप्शन को AbsoluteOptions_ द्वारा हटा दिया गया है। : डी –

+0

उस मामले के लिए, मुझे आश्चर्य है कि मैंने विकल्प का उपयोग क्यों नहीं किया? पुरानी आदतें धीरे-धीरे मरती हैं, मुझे लगता है। –

+0

अच्छा उदाहरण!लेकिन मूल ग्राफ को ओवरलैप न करने के लिए ऐसे मामलों में 'एपिलॉग' के बजाय 'प्रोलॉग' का उपयोग करना शायद बेहतर है। –

4

बस एक किकस्टार्ट:

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

और, belisarius' code से उधार, आप भी अपने इनसेट सहभागी का ध्यान केंद्रित 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}] 

या, यदि आप इंटरसेट को इंटरैक्टिव रूप से रखना चाहते हैं:

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[{{[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 अच्छा समाधान। @Sjoerd C. de Vries इसका उपयोग करके मैंने देखा कि इन्सेट को ले जाना और फिर साजिश पर क्लिक करना इंसेट को "कूद" देगा जब आप वास्तव में इंसैट एक्स अक्ष फोकस को बदलना चाहते हैं, जिसे कभी-कभी मिश्रित किया जाता है। इस के आसपास काम करने के लिए कोई सुझाया गया सुधार? शायद एक दूसरा लोकेटर ... – dbjohn

+1

@ डीबीजोह्न हाँ, मैंने यह भी देखा। क्लिक हमेशा निकटतम लोकेटर के पास जाता है। इसका मतलब यह हो सकता है कि वक्र पर क्लिक करने से ज़ूम विंडो को स्थानांतरित किया जा सकता है यदि यह वक्र पर बिंदु से अधिक नजदीक था जिसे आपने पहले ज़ूम किया था। मैंने संशोधक कुंजी या तो (ctrl-click आदि) का उपयोग करने के बारे में सोचा था, लेकिन इससे पल के लिए तैयार होने की तुलना में यह अधिक जटिल बना देगा। ज़ूम विंडो की स्थिति का चयन करने के लिए एक और समाधान 2 डी स्लाइडर हो सकता है। –

2

मैं इस उपकरण में बनाया बेहतर की जरूरत होती एक क्षेत्र पाते हैं। मैं डेमो here पर आधारित इस समाधान पर काम कर रहा हूं। मैं ज़ूम की गई छवि और अनजान छवि को अलग करना पसंद करता हूं और बोनस के रूप में मैंने एक प्रस्तुत करने योग्य क्षेत्र जोड़ा जहां कोई प्रासंगिक टेक्स्ट या समीकरण डाल सकता था। विभिन्न कार्यों के लिए पहलू अनुपात को मैन्युअल रूप से tweaked की आवश्यकता हो सकती है।

(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

संबंधित मुद्दे