Hi,
I’ve looked around here and on the old brms forum but can’t quite figure out how to extract the ggplot2 object from marginal_smooths(). I’d like to do some customization like adding geom_points() from the primary data and changing the theme.
I have tried plot1 <- plot( marginal_smooths( fit ) ) , but then can’t figure out what within the plot1 object can be extracted and how it can be integrated into a ggplot2 graphic.
Thanks!
Please also provide the following information in addition to your question:
- Operating System: Win 10
- brms Version: 2.3.1
The plot method returns a list of ggplot objects, which is explained in the doc of ?marginal_effects
.
Does that work through the marginal_smooths function or do I have to do it differently using marginal_effects? This is what I get and I don’t see what is the ggplot2 object I’d extract:
plot1 ← marginal_smooths(gam1)
str(plot1)
List of 1
mu: s(disp):'data.frame': 100 obs. of 5 variables:
.. disp : num [1:100] 71.1 75.1 79.2 83.2 87.3 …
… estimate__: num [1:100] 11.04 10.43 9.82 9.2 8.59 ...
.. se__ : num [1:100] 1.186 1.067 0.967 0.854 0.77 …
… lower__ : num [1:100] 8.52 8.18 7.78 7.36 6.94 ...
.. upper__ : num [1:100] 13.3 12.5 11.7 10.8 10.1 …
…- attr(, “response”)= chr “mu: s(disp)”
…- attr(, “effects”)= chr “disp”
…- attr(, “surface”)= logi FALSE
…- attr(, “points”)=‘data.frame’: 32 obs. of 1 variable:
… …$ disp: num [1:32] 160 160 108 258 360 …
…- attr(*, “too_many_covars”)= logi FALSE
- attr(*, “class”)= chr “brmsMarginalEffects”
- attr(*, “smooths_only”)= logi TRUE
plot(marginal_smooths(gam1)) is the same object class as plot(marginal_effects(gam1))
The help file says:
“The corresponding plot
method returns a named list of ggplot
objects, which can be further customized using the ggplot2 package”
but I’m not sure what to extract - I see the ggplot attributes and functions within “layers” in the plot call, but not what is an extractable object.
gg <- plot(marginal_smooths(gam1))[[1]]
gg + xlab(“abc”)
1 Like
This is what I get -
plot1 <- plot(marginal_smooths(gam1))
plot1 + theme_bw()
NULL
plot1 <- plot(marginal_smooths(gam1))
plot1 + xlab(“abc”)
Error in plot1 + xlab(“abc”) : non-numeric argument to binary operator
Oh I see, I left out the [[1]], works now.
Thanks!
One more question - I’m trying to combine the marginal smooth plot with a separate plot, just using the mtcars data:
gam1 <- brm(mpg ~ s(displ) , data=mtcars)
plot1 <- plot(marginal_smooths(gam1))[[1]]
plot1 + geom_point(data=mtcars, aes(x=disp, y=mpg), color=“Red”, cex=3)
Error in FUN(X[[i]], …) : object ‘lower__’ not found
This is slowly becoming a pure ggplot issue ;-)
you have to use inherit.aes = FALSE
in geom_point()
.
I know, but you’re SO much easier to get in touch with than Hadley :)
Thanks again!
Paul