2012-08-26 17 views
6

मैं कुछ समय श्रृंखला डेटा के साथ काम कर रहा हूं और कुछ शर्तों को सच होने पर चार्ट क्षेत्र को हाइलाइट करना चाहता हूं। उदाहरण के लिए:ggplot2: हाइलाइट चार्ट क्षेत्र

require(ggplot2) 
require(quantmod) 
initDate <- "1993-01-31" 
endDate <- "2012-08-10" 
symbols <- c("SPY") 
getSymbols(symbols, from=initDate, to=endDate, index.class=c("POSIXt","POSIXct")) 
spy<-SPY$SPY.Adjusted 
spy$sma<-SMA(spy$SPY.Adjusted,200) 
spy<-spy[-(1:199),] 
spy<-as.data.frame(spy) 
ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_line()+geom_line(aes(x=index(spy),y=spy$sma)) 

ऊपर कोड डेटा भूखंडों, लेकिन मैं अनुभाग कैसे हाइलाइट कर सकते हैं SMA ऊपर जब कभी करीब है? यह प्रश्न How to highlight time ranges on a plot? के समान है, लेकिन फिर यह मैनुअल है। सशर्त साजिश के लिए ggplot2 में कोई फ़ंक्शन है?

+3

सवाल का एक गूगल समर के हिस्से के रूप में माइकल Weylandt द्वारा बनाई xtsExtra पैकेज में नए ब्रांड plot.xts विधि का उपयोग कर साजिश कर सकता है आप के लिए रास्ता _is_ से लिंक यह करो। ** ggplot2 ** में अभी तक 'geom_shade_the_region_that_I_have_in_mind_you_know_that_one()' जैसी कुछ समझने की कार्यक्षमता नहीं है। आपको वास्तव में यह बताना होगा कि आप किस क्षेत्र को छायांकित करना चाहते हैं। – joran

+1

यदि आप उचित कोड लाइब्रेरी कॉल करते हैं तो यह इंगित करने के लिए कि आप उस कोड को चलाने के लिए कौन से पैकेज की आवश्यकता है, आप अपने कोड के साथ प्रयोग करने के लिए गैर-क्वांट्स प्राप्त करने की संभावनाओं को बढ़ाएंगे। –

+0

@joran अंतर्दृष्टिपूर्ण उत्तर के लिए बहुत बहुत धन्यवाद ~ कुछ उपयोगी के साथ आने के लिए कड़ी मेहनत करेगा। – user1234440

उत्तर

13

quantmod पैकेज की TA.R फ़ाइल में कोड के आधार पर, यह कोड है जो आयताकारों के प्रारंभ और सिरों को खोजने के लिए rle का उपयोग करता है।

runs <- rle(as.logical(spy[, 1] > spy[, 2])) 
l <- list(start=cumsum(runs$length)[which(runs$values)] - runs$length[which(runs$values)] + 1, 
      end=cumsum(runs$lengths)[which(runs$values)]) 
rect <- data.frame(xmin=l$start, xmax=l$end, ymin=-Inf, ymax=Inf) 

कम्बाइन उस प्रश्न का accepted answer से कुछ ggplot2 कोड के साथ आप से जुड़ा हुआ:

ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_line()+geom_line(aes(x=index(spy),y=spy$sma))+geom_rect(data=rect, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), color="grey20", alpha=0.5, inherit.aes = FALSE) 

और आपको मिलता है:

enter image description here

यदि आप की साजिश रचने का क्रम उलटने और alpha=1geom_rect में इसका उपयोग करें (या नहीं) आप जितना चाहें उतना अधिक देख सकते हैं:

ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_rect(data=rect, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), border=NA, color="grey20", alpha=1, inherit.aes = FALSE)+geom_line()+geom_line(aes(x=index(spy),y=spy$sma)) 

enter image description here


चूंकि आप एक xts वस्तु है। आप data.frame में भी कनवर्ट नहीं करना चाहते हैं। यहाँ कैसे आप इसे कोड project.

spy <- as.xts(spy) 
require(xtsExtra) 
plot(spy, screens=1, 
    blocks=list(start.time=paste(index(spy)[l$start]), 
       end.time=paste(index(spy)[l$end]), col='lightblue'),      
    legend.loc='bottomright', auto.legend=TRUE) 

enter image description here

+0

+1 जो गर्म है। माइकल ने निश्चित रूप से कुछ महान काम किया! –