2017-01-15 51 views
2

我试图绘制任何TS数据上的点。 我的主要问题是如何将数据传输到此功能。 应该能够绘制点这个TS,即5%的增幅逐年从时间序列数据中的任何函数绘制点R

require(datasets) 
require(zoo) 
## ploting 
MyPlot <- function(x=ldeaths,Events, pch = 19, col = 'red', cex = 1) 
{ 
plot(x) 
myData <- as.zoo(x) 
points(myData[Events], pch = pch, col = col, cex = cex) 
    } 

### My problem 
MyPlot(x = anyTimeSeriesdata, Events = anyFunOperatingOnTS) 

如何定义anyFunOperatingOnTS

+0

这是一个时间序列数据,所以想象你想绘制ts然后在ts图上绘制一些特定的点。即销售月比增加5%以上。 – Garf

回答

1

选中此功能。您可以根据需要通过percent = 0.05获取>5%或其他值。

MyPlot <- function(x = ldeaths, Events = TRUE, pch = 19, col = 'red', 
         cex = 1, xlab = "Date", ylab = "Deaths", percent = 0.05){  
    #Convert x to data.frame 
    intermediate_data = as.data.frame(t(matrix(x, 12, 
         dimnames = list(month.abb, unique(floor(time(x))))))) 

    #Make year (from rownames) a column 
    intermediate_data$year = rownames(intermediate_data) 

    #Melt data into long form 
    require(reshape2) 
    intermediate_data = melt(intermediate_data, id = "year") 

    #Convert to POSIXct format (I've added 15 as day for each month) 
    intermediate_data$date = as.POSIXct(paste(intermediate_data$year, 
      intermediate_data$variable,"15",sep = "/"),format = "%Y/%b/%d") 

    #Retain only the relevant columns      
    intermediate_data = intermediate_data[,c(4,3)] 

    #Order by date 
    intermediate_data = intermediate_data[with(intermediate_data, order(date)), ] 

    #Compute difference 
    intermediate_data$diff = c(0,diff(x = intermediate_data$value, 
         lag = 1, differences = 1)) 

    #Find out the rows for which difference is greater than percent (default is 5%) 
    for (i in 2:nrow(intermediate_data)){ 
     if (intermediate_data$diff[i]/intermediate_data$value[i-1] > percent){ 
      intermediate_data$Remarks[i] = paste(">",percent,sep="") 
     } else { 
      intermediate_data$Remarks[i] = paste("!>",percent,sep="") 
     } 
    } 

    #Separate the ones with greater than 5% into another data.frame 
    timeseries = subset(intermediate_data, 
      intermediate_data$Remarks == paste(">",percent,sep="")) 

    #Plot the lines 
    plot(x = intermediate_data$date, y = intermediate_data$value, 
         type = "l", xlab = xlab, ylab = ylab) 

    #Plot the points for greater than percent if EVENTS == TRUE 
    if (Events == TRUE){ 
     points(x = timeseries$date, y = timeseries$value, 
         pch = pch, col = col, cex = cex) 
    } 
} 
+0

很好的回答。写得好。谢谢。 – Garf