2012-12-05 11 views
28

enter image description hereकैसे एक "ज़ूम में" प्रभाव आर

में स्केच नक्शा के रूप में ऊपर के उदाहरण के लिए सामान्य वितरण के लिए मतलब और विचरण आकर्षित करने के लिए, आप कल्पना कर सकते ऊपरी एक पैरामीटर अंतरिक्ष के एक भूखंड है,,, और निचला एक इसी घनत्व साजिश है। ऐसा करने के लिए कोई संकेत? धन्यवाद ~

अद्यतन: एक वृद्धि के रूप में, क्या मैं इसके लिए एक इंटरैक्टिव संस्करण बना सकता हूं? कहें, जब भी मैं एक बिंदु पर माउस-आर, नीचे इसी साजिश को दिखाता है।

+1

अच्छा सवाल और चित्रण! – poplitea

+1

'plotrix' पैकेज में 'zoomInPlot' फ़ंक्शन है हालांकि आपके प्रश्न का उत्तर इस फ़ंक्शन द्वारा नहीं दिया गया है, स्रोत कोड उपयोगी हो सकता है। –

+0

@TylerRinker, यह वास्तव में 'zoomInPlot' नहीं है, क्योंकि "ज़ूम" प्लॉट मूल साजिश का हिस्सा नहीं है, यह मेरे द्वारा चुने गए बिंदु के अनुसार उत्पन्न होता है (या एक निश्चित बिंदु, यदि मैं एक इंटरैक्टिव संस्करण नहीं बना सकता) – ziyuang

उत्तर

15

यहाँ एक इंटरैक्टिव संस्करण है, तो आप एक बिंदु पर क्लिक कर सकते हैं और फिर इसी घनत्व साजिश दिखाई देता है। मुख्य रूप से ?identify का उपयोग किया गया था और @Tyler ने ?zoomInPlot का सुझाव दिया था।

यह कैसे काम करता है पर कुछ अधिक जानकारी के: rxlim और rylim बहुत शुरुआत में परिभाषित किया जो चयनित बिंदु चारों ओर से घेरे है, तो एक कारक /20 बदलने के लिए चाहते हो सकता है आयत का आकार है। अनेक क्लिक करने की संभावना nontrivial है: identify(), केवल "हाल का" साजिश में क्लिक का पता चलता अर्थात

par(mfrow = c(1,2)) 
plot(1:10) # 1 
plot(1:10) # 2 
identifyPch(1:10) 

केवल # 2 साजिश में क्लिक का पता चलता (यहाँ identifyPch()?identify से है)। इस समस्या के लिए par(mfg=c(1, 1)) इस्तेमाल किया गया था:

MFG

प्रपत्र ग (i, j) के एक संख्यात्मक वेक्टर मैं कहाँ और जे संकेत मिलता आंकड़े की एक सरणी में जो आंकड़ा अगले तैयार किया जा रहा है (अगर सेटिंग) या खींचा जा रहा है (यदि पूछताछ हो)। सरणी पहले से ही mfcol या mfrow द्वारा सेट कर दी जानी चाहिए।

enter image description here

zoom <- function (x, y, xlim, ylim, xd, yd) 
{ 
    rxlim <- x + c(-1, 1) * (diff(range(xd))/20) 
    rylim <- y + c(-1, 1) * (diff(range(yd))/20) 
    par(mfrow = c(1, 2)) 
    plot(xd, yd, xlab = "mean", ylab = "sd") 
    xext <- yext <- rxext <- ryext <- 0 
    if (par("xaxs") == "r") { 
    xext <- diff(xlim) * 0.04 
    rxext <- diff(rxlim) * 0.04 
    } 
    if (par("yaxs") == "r") { 
    yext <- diff(ylim) * 0.04 
    ryext <- diff(rylim) * 0.04 
    } 
    rect(rxlim[1] - rxext, rylim[1] - ryext, rxlim[2] + rxext, 
     rylim[2] + ryext) 
    xylim <- par("usr") 
    xypin <- par("pin") 
    rxi0 <- xypin[1] * (xylim[2] - (rxlim[1] - rxext))/diff(xylim[1:2]) 
    rxi1 <- xypin[1] * (xylim[2] - (rxlim[2] + rxext))/diff(xylim[1:2]) 
    y01i <- xypin[2] * (xylim[4] - (rylim[2] + ryext))/diff(xylim[3:4]) 
    y02i <- xypin[2] * ((rylim[1] - ryext) - xylim[3])/diff(xylim[3:4]) 
    mu <- x 
    curve(dnorm(x, mean = mu, sd = y), from = -4 * y + mu, to = 4 * y + mu, 
     xlab = paste("mean:", round(mu, 2), ", sd: ", round(y, 2)), ylab = "") 
    xypin <- par("pin") 
    par(xpd = NA) 
    xylim <- par("usr") 
    xymai <- par("mai") 
    x0 <- xylim[1] - diff(xylim[1:2]) * (xymai[2] + xymai[4] + 
             rxi0)/xypin[1] 
    x1 <- xylim[1] - diff(xylim[1:2]) * (xymai[2] + xymai[4] + 
             rxi1)/xypin[1] 
    y01 <- xylim[4] - diff(xylim[3:4]) * y01i/xypin[2] 
    y02 <- xylim[3] + diff(xylim[3:4]) * y02i/xypin[2] 
    par(xpd = TRUE) 
    xend <- xylim[1] - diff(xylim[1:2]) * xymai[2]/(2 * xypin[1]) 
    xprop0 <- (xylim[1] - xend)/(xylim[1] - x0) 
    xprop1 <- (xylim[2] - xend)/(xylim[2] - x1) 
    par(xpd = NA) 
    segments(c(x0, x0, x1, x1), 
      c(y01, y02, y01, y02), 
      c(xend, xend, xend, xend), 
      c(xylim[4] - (xylim[4] - y01) * xprop0, 
      xylim[3] + (y02 - xylim[3]) * xprop0, 
      xylim[4] - (xylim[4] - y01) * xprop1, 
      xylim[3] + (y02 - xylim[3]) * xprop1)) 
    par(mfg = c(1, 1)) 
    plot(xd, yd, xlab = "mean", ylab = "sd") 
} 

ident <- function(x, y, ...) 
{ 
    ans <- identify(x, y, n = 1, plot = FALSE, ...) 
    if(length(ans)) { 
    zoom(x[ans], y[ans], range(x), range(y), x, y) 
    points(x[ans], y[ans], pch = 19) 
    ident(x, y) 
    } 
} 

x <- rnorm(10) 
y <- rnorm(10, mean = 5) 
par(mfrow = c(1, 2)) 
plot(x, y, xlab = "mean", ylab = "sd") 
ident(x, y) 
+0

+1। आपके संशोधन के बाद, अब काम करता है। (मैंने त्रुटि की सूचना दी थी, लेकिन टिप्पणी हटा दी है) –

+0

कूल और धन्यवाद! – ziyuang

+0

@ ज़ियुआंग, मैंने अभी फ़ंक्शन संपादित किया है। एक समस्या थी - आप एक ही बिंदु पर एक ही समय पर क्लिक नहीं कर सके .. कोड अब छोटा है। – Julius

9

आईप्लॉट पैकेज इस के बहुत करीब आता है, हालांकि तकनीकी रूप से कोई 'ज़ूमिंग' नहीं है। आईप्लॉट्स में जावा जीयूआई के साथ लागू इंटरैक्टिव लिंक्ड प्लॉट हैं। आप एक प्लॉट पर अंक चुन सकते हैं और अन्य प्लॉट्स में एक ही बिंदु हाइलाइट हो जाते हैं। The website for the package is here

library(iplots) 
data(Cars93) 
iplot(Cars93$Horsepower, Cars93$MPG.city) 
ihist(Cars93$Horsepower) 

यहाँ, मैं छोड़ दिया scatterplot में कुछ बिंदुओं का चयन किया है, उन्हें लाल मोड़, और वे भी सही हिस्टोग्राम में प्रकाश डाला (हिस्टोग्राम करीबी एक घनत्व की साजिश करने के लिए उनके पास है) हो जाते हैं।

enter image description here

+0

आपके उत्तर के लिए धन्यवाद। यह जांच के लायक भी है। – ziyuang

+0

कोई समस्या नहीं - मैं एक पैकेज नाम और कोड की चार पंक्तियों को पोस्ट करने के लिए थोड़ा शर्मिंदा था जब मैं बहुत निश्चित था कि कोई स्क्रैच से एक अद्भुत कार्य को कोड करने के लिए चुनौती उठाएगा। लेकिन iplots एक शानदार उपकरण है जो व्यापक उपयोग के योग्य है। – MattBagg

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