R - shade area between two crossing lines with different colors

前端 未结 2 1367
旧时难觅i
旧时难觅i 2021-01-20 17:20

I have a matrix (named ichimoku) with 516 rows and 2 columns ,each one of them containing values to be plotted, the goal is to recreate the clouds for the Ichimoku strategy.

2条回答
  •  礼貌的吻别
    2021-01-20 17:33

    If you find the intersections between the curves, then you can draw the polygons between the intersections. Here is a modification of a previous post where they find intersections between curves, and a function to draw the polygons.

    ## Some sample data
    set.seed(0)
    dat <- data.frame(x1=3*sin(3*(x=seq(0,10,len=100)))+rnorm(100),
                      x2=2*cos(x)+rnorm(100))
    
    ## https://stackoverflow.com/questions/20519431/finding-point-of-intersection-in-r
    intersects <- function(x1, x2) {
        seg1 <- which(!!diff(x1 > x2))                            # location of first point in crossing segments
        above <- x2[seg1] > x1[seg1]                              # which curve is above prior to crossing
        slope1 <- x1[seg1+1] - x1[seg1]
        slope2 <- x2[seg1+1] - x2[seg1]
        x <- seg1 + ((x2[seg1] - x1[seg1]) / (slope1 - slope2))
        y <- x1[seg1] + slope1*(x - seg1)
        data.frame(x=x, y=y, pindex=seg1, pabove=(1:2)[above+1L])  # pabove is greater curve prior to crossing
    }
    
    ichimoku <- function(data, addLines=TRUE) {
        ## Find points of intersections
        ints <- intersects(data[,1], data[,2])
        intervals <- findInterval(1:nrow(data), c(0, ints$x))
    
        ## Make plot
        matplot(data, type="n", col=2:3, lty=1, lwd=4)
        legend("topright", c("A", "B"), col=3:2, lty=1, lwd=2)
    
        ## Draw the polygons
        for (i in seq_along(table(intervals))) {
            xstart <- ifelse(i == 1, 0, ints$x[i-1])
            ystart <- ifelse(i == 1, dat[1,ints$pindex[1]], ints$y[i-1])
            xend <- ints$x[i]
            yend <- ints$y[i]
            x <- seq(nrow(data))[intervals == i]
            polygon(c(xstart, x, xend, rev(x)), c(ystart, data[x,1], yend, rev(data[x,2])),
                    col=ints$pabove[i]%%2+2)
        }
    
        ## Add lines for curves
        if (addLines)
            invisible(lapply(1:2, function(x) lines(seq(nrow(data)), data[,x], col=x%%2+2, lwd=2)))
    }
    
    ## Plot the data
    ichimoku(dat)
    

提交回复
热议问题