This package provides a ggplot2 equivalent of the base
Install from GitHub:
# install.packages("remotes") remotes::install_github("grantmcdermott/ggiplot")
As we’ll see, the package essentially consists of a single function —
ggiplot() — that tries to closely mimic it base compatriot. However, by leveraging the ggplot2 API and infrastructure, it also offers some additional functionality.
Start by loading the ggiplot package. Note that we also have to load fixest and ggplot2 in order to actually use it.
Let’s compare the (base)
ggiplot default plots.
There are some small differences, but they are certainly producing the same basic plot. To get even closer to the original, we could specify the use of errorbar(s) rather than (
ggiplot’s default of) pointrange(s).
ggiplot(est_did, geom = 'errorbar')
Many of the arguments for
iplot() carry over to
ggiplot() too. This is deliberate, since we want to reduce the cognitive overhead of switching between the two plotting methods. For example, we can join points using the same
pt.join = TRUE argument.
iplot(est_did, pt.join = TRUE)
ggiplot(est_did, pt.join = TRUE, geom_style = 'errorbar')
ggiplot defaults are slightly different in some cases, but may require less arguments depending on what you want to do. For example,
ggiplot(est_did, geom_style = 'ribbon')
ggiplot(est_did, geom_style = 'ribbon', pt.pch = NA, col = 'orange') #> Scale for 'colour' is already present. Adding another scale for 'colour', #> which will replace the existing scale.
We’ll demonstrate using the staggered treatment example from the fixest introductory vignette.
Again, for comparison, here the base
iplot original. Note that we add the legend manually.
If we don’t name out list of models then it defaults to something sensible.
One nice thing about the ggplot2 API is that it makes changing multiplot figures simple. For example, if you don’t like the presentation of “dodged” models in a single frame, then it’s easy to facet them instead using the
multi_style = 'facet' argument.
An area where
ggiplot shines is in complex multiple estimation cases, such as lists of
fixest_multi objects. To illustrate, let’s add a split variable (group) to our staggered dataset.
Now re-run our two regressions from earlier, but splitting the sample to generate
ggiplot do fine with a single
fixest_multi object (although remember that we have to manually add a legend for the former)
ggiplot(est_twfe_grp, ref.line = -1, main = 'Staggered treatment: TWFE')
iplot complains if we combine a list of several
iplot(list('TWFE' = est_twfe_grp, 'Sun & Abraham (2020)' = est_sa20_grp), ref.line = -1, main = 'Staggered treatment: Split mutli-sample') #> Error in coefplot_prms(object = object, ..., sd = sd, ci_low = ci_low, : The first element of 'object' raises and error: #> Error in coeftable(object = my__object__) : #> Sorry, the coeffficients table could not be extracted.
… but is even better when we use faceting instead of dodged errorbars. Let’s use this an opportunity to construct a fancy plot that invokes some additional arguments and ggplot theming.
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', theme = theme_minimal() + theme(text = element_text(family = 'HersheySans'), plot.title = element_text(hjust = 0.5), legend.position = 'none'))
Setting the theme inside the
ggiplot() call is optional and not strictly necessary, since the ggplot2 API allows programmatic updating of existing plots. E.g.
last_plot() + theme_grey() + theme(legend.position = 'none') + scale_colour_brewer(palette = 'Set1', aesthetics = c('colour', 'fill')) #> Scale for 'colour' is already present. Adding another scale for 'colour', #> which will replace the existing scale.
Dictionaries work similarly to
iplot. Simple example:
You can either set the dictionary directly in the plot call…
ggiplot(est_letters, dict = dict)
… Or, set it globally using the
setFixest_dict() # reset
The material in this repository is made available under the MIT license.