2016-03-07 35 views

回答

1

我意識到這可以通過將ggplot2ggproto延伸來完成。 ggprotovignette有一個很容易適應的例子:

StatDensityCommon <- ggproto("StatDensityCommon", Stat, 
    required_aes = "x", 

    setup_params = function(data, params) { 
    if (!is.null(params$bandwidth)) 
     return(params) 

    xs <- split(data$x, data$group) 
    bws <- vapply(xs, bw.nrd0, numeric(1)) 
    bw <- mean(bws) 
    message("Picking bandwidth of ", signif(bw, 3)) 

    params$bandwidth <- bw 
    params 
    }, 

    compute_group = function(data, scales, bandwidth = 1) { 
    ### CUSTOM FUNCTION HERE ### 
    d <- locfit::density.lf(data$x) #FOR EXAMPLE 
    data.frame(x = d$x, y = d$y) 
    } 
) 

stat_density_common <- function(mapping = NULL, data = NULL, geom = "line", 
           position = "identity", na.rm = FALSE, show.legend = NA, 
           inherit.aes = TRUE, bandwidth = NULL, 
           ...) { 
    layer(
    stat = StatDensityCommon, data = data, mapping = mapping, geom = geom, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
    params = list(bandwidth = bandwidth, na.rm = na.rm, ...) 
) 
} 

ggplot(mpg, aes(displ, colour = drv)) + stat_density_common()