我想显示由geom_smooth()
创建的情节,但是能够描述情节是如何创建的对我来说很重要。
我可以从文档中看到当n> = 1000时,使用gam作为平滑函数,但是我看不到使用了多少个结或者是什么函数生成了平滑。
示例:
library(ggplot2)
set.seed(12345)
n <- 3000
x1 <- seq(0, 4*pi,, n)
x2 <- runif(n)
x3 <- rnorm(n)
lp <- 2*sin(2* x1)+3*x2 + 3*x3
p <- 1/(1+exp(-lp))
y <- ifelse(p > 0.5, 1, 0)
df <- data.frame(x1, x2, x3, y)
# default plot
ggplot(df, aes(x = x1, y = y)) +
geom_smooth()
# specify method='gam'
# linear
ggplot(df, aes(x = x1, y = y)) +
geom_smooth(method = 'gam')
# specify gam and splines
# Shows non-linearity, but different from default
ggplot(df, aes(x = x1, y = y)) +
geom_smooth(method = 'gam',
method.args = list(family = "binomial"),
formula = y ~ splines::ns(x, 7))
如果我想使用默认参数,有没有办法识别用于创建平滑的函数,以便我可以在分析的方法部分准确描述它?
答案 0 :(得分:1)
我编写了一个函数,对StatSmooth
的{{1}}函数中使用的步骤进行逆向工程,以获取用于绘图的实际方法/公式参数。
该函数期望ggplot对象作为其输入,并带有一个附加的可选参数来指定与setup_params
对应的图层(如果未指定,则默认为1)。它以geom_smooth
的形式返回文本字符串,并且将所有参数输出到控制台。
设想的用例有两个方面:
功能:
"Method: [method used], Formula: [formula used]"
演示:
get.params <- function(plot, layer = 1){
# return empty string if the specified geom layer doesn't use stat = "smooth"
if(!"StatSmooth" %in% class(plot$layers[[layer]]$stat)){
message("No smoothing function was used in this geom layer.")
return("")
}
# recreate data used by this layer, in the format expected by StatSmooth
# (this code chunk takes heavy reference from ggplot2:::ggplot_build.ggplot)
layer.data <- plot$layers[[layer]]$layer_data(plot$data)
layout <- ggplot2:::create_layout(plot$facet, plot$coordinates)
data <- layout$setup(list(layer.data), plot$data, plot$plot_env)
data[[1]] <- plot$layers[[layer]]$compute_aesthetics(data[[1]], plot)
scales <- plot$scales
data[[1]] <- ggplot2:::scales_transform_df(scales = scales, df = data[[1]])
layout$train_position(data, scales$get_scales("x"), scales$get_scales("y"))
data <- layout$map_position(data)[[1]]
# set up stat params (e.g. replace "auto" with actual method / formula)
stat.params <- suppressMessages(
plot$layers[[layer]]$stat$setup_params(data = data,
params = plot$layers[[layer]]$stat_params)
)
# reverse the last step in setup_params; we don't need the actual function
# for mgcv::gam, just the name
if(identical(stat.params$method, mgcv::gam)) stat.params$method <- "gam"
print(stat.params)
return(paste0("Method: ", stat.params$method, ", Formula: ", deparse(stat.params$formula)))
}