0
我想使用與stats::density
不同的KDE方法,stat_density
/geom_density
使用不同的KDE方法來繪製KDE以進行分解。我應該怎麼做呢?geom_density - 自定義KDE
我想使用與stats::density
不同的KDE方法,stat_density
/geom_density
使用不同的KDE方法來繪製KDE以進行分解。我應該怎麼做呢?geom_density - 自定義KDE
我意識到這可以通過將ggplot2
與ggproto
延伸來完成。 ggproto
vignette有一個很容易適應的例子:
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()