Search code examples
rsjplot

How to color-code sjPlot::model_plots by positive/negative coefficients when making gridded plots?


I'd like to plot multiple models side-by-side using sjPlot::plot_models. Yet, when I run the following code:

set.seed(10)
a <- sample(c("low", "medium", "high"), 100, replace = T)
b <- rnorm(100)
c <- rnorm(100)

mod1 <- lm(b ~ a)
mod2 <- lm(c ~ a)

sjPlot::plot_models(mod1, mod2, grid = T)

Then the left plot will be red and the right plot will be blue. Is there a way to get the positive coefficients to be blue and the negatives (lower right) to be red?


Solution

  • You could use ggplot_build to conditionally change the colors in the layers by negative y values like this:

    library(ggplot2)
    library(dplyr)
    p <- sjPlot::plot_models(mod1, mod2, grid = T)
    
    q <- ggplot_build(p)
    q$data[[2]] = q$data[[2]] %>%
      mutate(colour = case_when(y < 0 ~ '#E41A1C', 
                                TRUE ~ '#377EB8'))
    q$data[[3]] = q$data[[3]] %>%
      mutate(colour = case_when(y < 0 ~ '#E41A1C', 
                                TRUE ~ '#377EB8'))
    
    q <- ggplot_gtable(q)
    plot(q)
    

    Created on 2023-03-11 with reprex v2.0.2