Open peter-bastian opened 3 years ago
The current release of see doesn't make it easy to access these plots for further tweaking.
If you run the function below, you can then do:
diagnostics <- check_model(mod)
diag_plots <- plot(diagnostics, return_list = TRUE)
to get a list of the individual plots. These are regular ggplot objects, so you can add more geoms, themes, etc. to them as you like.
plot.see_check_model <- function (x, style = theme_lucid,
colors = c("#3aaf85", "#1b6ca8", "#cd201f"),
return_list = FALSE,
...)
{
orig_x <- x
p <- list()
if (isTRUE(return_list)) {
panel <- FALSE
} else {
panel <- attr(x, "panel")
}
check <- attr(x, "check")
size_point <- attr(x, "dot_size")
size_line <- attr(x, "line_size")
size_text <- attr(x, "text_size")
alpha_level <- attr(x, "alpha")
dot_alpha_level <- attr(x, "dot_alpha")
detrend <- attr(x, "detrend")
if (missing(style) && !is.null(attr(x, "theme"))) {
theme_style <- unlist(strsplit(attr(x, "theme"), "::",
fixed = TRUE))
style <- get(theme_style[2], asNamespace(theme_style[1]))
}
if (missing(colors)) {
colors <- attr(x, "colors")
}
if (is.null(colors)) {
colors <- c("#3aaf85", "#1b6ca8", "#cd201f")
}
colors <- unname(colors)
if (is.null(alpha_level)) {
alpha_level <- 0.2
}
if (is.null(dot_alpha_level)) {
dot_alpha_level <- 0.8
}
if (is.null(check))
check <- "all"
if ("NCV" %in% names(x) && any(c("ncv", "linearity", "all") %in%
check)) {
p$NCV <- see:::.plot_diag_linearity(x$NCV, size_point, size_line,
alpha_level, theme_style = style, colors = colors,
dot_alpha_level = dot_alpha_level)
}
if ("HOMOGENEITY" %in% names(x) && any(c("homogeneity",
"all") %in% check)) {
p$HOMOGENEITY <- see:::.plot_diag_homogeneity(x$HOMOGENEITY,
size_point, size_line, alpha_level, theme_style = style,
colors = colors, dot_alpha_level = dot_alpha_level)
}
if ("VIF" %in% names(x) && any(c("vif", "all") %in% check)) {
p$VIF <- see:::.plot_diag_vif(x$VIF, theme_style = style,
colors = colors)
}
if ("OUTLIERS" %in% names(x) && any(c("outliers", "all") %in%
check)) {
p$OUTLIERS <- see:::.plot_diag_outliers_new(x$INFLUENTIAL,
size_text = size_text, size_line = size_line, theme_style = style,
colors = colors, dot_alpha_level = dot_alpha_level)
}
if ("QQ" %in% names(x) && any(c("qq", "all") %in% check)) {
p$QQ <- see:::.plot_diag_qq(x$QQ, size_point, size_line, alpha_level = alpha_level,
detrend = detrend, theme_style = style, colors = colors,
dot_alpha_level = dot_alpha_level)
}
if ("NORM" %in% names(x) && any(c("normality", "all") %in%
check)) {
p$NORM <- see:::.plot_diag_norm(x$NORM, size_line, alpha_level = alpha_level,
theme_style = style, colors = colors)
}
if ("REQQ" %in% names(x) && any(c("reqq", "all") %in% check)) {
ps <- see:::.plot_diag_reqq(x$REQQ, size_point, size_line,
alpha_level = alpha_level, theme_style = style,
colors = colors, dot_alpha_level = dot_alpha_level)
for (i in 1:length(ps)) {
p[[length(p) + 1]] <- ps[[i]]
}
}
if (panel) {
suppressWarnings(suppressMessages(do.call(plots, p)))
}
else {
suppressWarnings(suppressMessages(p))
}
}
It would be great if we could pass a named list of lists with extra ggplot layers to be applied to specific plots. In my use case I experience overplotting on the collinearity plot and would like to add scale_x_discrete(guide = guide_axis(n.dodge = 2))
to this one plot.
So maybe something like:
check_model(
model,
extra_layers = list(
"collinearity"=list(scale_x_discrete(guide = guide_axis(n.dodge = 2))),
"normality"=list(theme_bw(), labs(subtitle="my text"))
)
)
What do you think?
Now that see uses patchwork to combine plots, I think it makes more sense to leave this sort of tweaking to editing post-plot-creation:
library(performance)
library(see)
library(ggplot2)
m <- lm(mpg ~ factor(cyl) + disp + hp, data = mtcars)
pp <- check_model(m)
p <- plot(pp)
p
p[[3]] <- p[[3]] + labs(y = "Variance Inflation\nFactor (VIF)")
p[[6]] <- p[[6]] + xlim(c(-5, 6))
p
Created on 2021-07-26 by the reprex package (v2.0.0)
I am looking for a way to control (in my case, reduce) the font sizes used in the plots generated by check_model().
Is there some way to do this? I have tried passing arguments to the print() method after capturing the check_model() output in a variable, like this:
plots <- check_model(m)
print(plots, main="this is a test")
But that does not work. Seems like I could pass something via the ... in check_model() to be used by see, but that is unclear. Would another solution be to create my own custom see theme?
I have also seen reference to a "base" parameter that could work to scale the fonts.