This package provides ggplot2 equivalents of the (base)
fixest::iplot functions. The goal of ggiplot is to produce nice coefficient and interaction plots (including event study plots) with minimal effort, but with lots of scope for further customization.
The package is not yet on CRAN, but can be installed from R-universe:
install.packages("ggiplot", repos = "https://grantmcdermott.r-universe.dev")
The package website provides a number of examples in the help documentation. (Also available by typing
?ggiplot in your R console.) But here are a few quickstart examples to whet your appetite.
Start by loading the ggiplot and fixest packages together. Note that ggiplot only supports fixest model objects, so the latter must be loaded alongside the former.
ggcoefplot to draw basic coefficient plots.
est = feols( Petal.Length ~ Petal.Width + Sepal.Length + Sepal.Width + Species, data = iris ) # coefplot(est) ## base version ggcoefplot(est) ## this package
The above plot call and output should look very familiar to regular fixest users. Like its base equivalent,
ggcoefplot can be heavily customized and contains various shortcuts for common operations. For example, we can use regex the control the coefficient grouping logic.
ggiplot function is a special case of
ggocoefplot that only plots coefficients with factor levels or interactions (specifically, those created with the
i() operator). This is especially useful for producing event study plots in a difference-in-differences (DiD) setup.
Again, the above plot call and output should look very familiar to regular fixest users. But note that
ggiplot supports several features that are not available in the base
iplot version. For example, plotting multiple confidence intervals and aggregate treatments effects.
And you can get quite fancy, combining lists of complex multiple estimation objects with custom themes, and so on.
base_stagg_grp = base_stagg base_stagg_grp$grp = ifelse(base_stagg_grp$id %% 2 == 0, 'Evens', 'Odds') est_twfe_grp = feols( y ~ x1 + i(time_to_treatment, treated, ref = c(-1, -1000)) | id + year, data = base_stagg_grp, split = ~grp ) est_sa20_grp = feols( y ~ x1 + sunab(year_treated, year) | id + year, data = base_stagg_grp, split = ~grp ) ggiplot( list("TWFE" = est_twfe_grp, "Sun & Abraham (2020)" = est_sa20_grp), ref.line = -1, main = "Staggered treatment: Split mutli-sample", xlab = "Time to treatment", multi_style = "facet", geom_style = "ribbon", facet_args = list(labeller = labeller(id = \(x) gsub(".*: ", "", x))), theme = theme_minimal() + theme( text = element_text(family = "HersheySans"), plot.title = element_text(hjust = 0.5), legend.position = "none" ) )