Search code examples
rggplot2contourdepth

How to extract depth contours (depthContour from DepthProc) to use them in ggpplot2?


Consider the following data, displayed in ggplot2:

## Data in a data.frame
x <- rnorm(n=1E3, sd=2)
y <- x*1.2 + rnorm(n=1E3, sd=2)
df <- data.frame(x,y)

library(ggplot2)
ggplot(df, aes(x, y)) +
  geom_point()

enter image description here

Now, consider the following depth contours using the depthContour function from the DepthProc package:

library(DepthProc)
depthContour(df, depth_params = list(
               method = "Local",
               beta = 0.1,
               depth_params1 = list(method = "Projection")
             ))

enter image description here

Is it possible to extract the black depth contour lines only (i.e. without fill colors) so that to add them into the ggplot2 graph?

Any help would be welcome


Solution

  • Something like that (not exactly the same contour plot because of the rnorm-based initial data).

    #See depthContour function from the DepthProc package at:
    #https://github.com/zzawadz/DepthProc/blob/7d676879a34d49416fb00885526e27bcea119bbf/R/depthContour.R
        
        ## Data in a data.frame
        x <- rnorm(n=1E3, sd=2)
        y <- x*1.2 + rnorm(n=1E3, sd=2)
        df <- data.frame(x,y)
        
        n <- 50 #for the n*n matrix
        xlim = extendrange(df[, 1], f = 0.1)
        ylim = extendrange(df[, 2], f = 0.1)
        
        x_axis <- seq(xlim[1], xlim[2], length.out = n)
        y_axis <- seq(ylim[1], ylim[2], length.out = n)
        
        xy_surface <- expand.grid(x_axis, y_axis)
        xy_surface <- cbind(xy_surface[, 1], xy_surface[, 2])
        
        ux_list <- list(u = xy_surface, X = df)
        
        library(DepthProc) 
        depth_params = list(method = "Local", beta = 0.1, depth_params1 = list(method = "Projection"))
        depth_params_list <- c(ux_list, depth_params)
        depth_surface_raw <- do.call(depth, depth_params_list) #the higher the 'n', the longer the running process
        depth_surface <- matrix(depth_surface_raw, ncol = n)
        
        # depth_med <- depthMedian(df, depth_params) #for the depth median, if needed
        
        library(reshape2)
        depth_surface_melt <- melt(depth_surface)
        depth_surface_melt <- cbind(xy_surface, depth_surface_melt[, 3])
        depth_surface_melt <- data.frame(depth_surface_melt)
        
        library(ggplot2)
        ggplot(df, aes(x, y))+
          scale_x_continuous(limits=c(-8,10),expand=c(0,0),breaks=c(-8,-5,0,5,10),labels=c("",-5,0,5,10))+
          scale_y_continuous(limits=c(-12,12),expand=c(0,0),breaks=c(-12,-10,-5,0,5,10,12),labels=c("",-10,-5,0,5,10,""))+
          geom_point(color="grey80")+
          geom_contour(depth_surface_melt, mapping=aes(x=X1, y=X2, z=X3), bins=10, color="black", size=0.7)
    

    enter image description here