As was the case with nonlinear terms, the
relationship between x and y in a model with
interactions also (typically) depends on multiple coefficients and thus,
a visual summary tends to be much more readily understood than a numeric
one.
For models with interactions, we must simultaneously visualize the
effect of two explanatory variables. The visreg package
offers two methods for doing so; this page describes what we call
cross-sectional plots, which plot one-dimensional relationships
between the response and one predictor for several values of another
predictor, either in separate panels or overlaid
on top of one another. The package also provides methods for
constructing surface plots, which
attempt to provide a picture of the regression surface over both
dimensions simultaneously.
Let’s fit a model that involves an interaction between a continuous term and a categorical term:
airquality$Heat <- cut(airquality$Temp, 3, labels=c("Cool", "Mild", "Hot"))
fit <- lm(Ozone ~ Solar.R + Wind * Heat, data=airquality)We can then use visreg to see how the effect of wind on
ozone differs depending on the temperature:

Or alternatively, see how the effect of temperature depends on the wind level:

Note that, since Wind is a continuous variable, the
panels above are somewhat arbitrary. By default, visreg
sets up three panels using the 10th, 50th, and 90th percentiles, but the user can change both the number and the location of
these break points.
By default, visreg uses the lattice package
to lay out the panels. Thus, in order to change the appearance of these
sorts of plots, you may have to read the lattice
documentation for the relevant options, such as layout in
the above examples. Alternatively, you can use ggplot2 as the graphics engine by
specifying gg=TRUE:
visreg(fit, "Wind", by="Heat", gg=TRUE)
visreg(fit, "Heat", by="Wind", gg=TRUE)
In all of these plots, note that each partial residuals appears exactly once in the plot, in the panel it is closest to.
Options
For a numeric by variable, the breaks
argument controls the values at which the cross-sections are taken. By
default, cross-sections are taken at three quantiles (10th, 50th, and
90th), but a larger number can be specified:

If breaks is a vector of numbers, it specifies the
values at which the cross-sections are to be taken:

Graphical options: lattice
As mentioned above, when using lattice as the graphics
engine, the appearance of a plot can typically be changed by specifying
the appropriate lattice option, which gets passed along by
visreg. One exception is the appearance of lines, points,
and bands, which are specified just as they are
in base plots:

Another exception is the strip option;
visreg sets up the strip internally, which interferes with
the user passing the strip option along to
lattice. visreg does, however, explicitly
provide the strip.names option:

You can also explicitly specify the labels for each strip:

Other aspects of the strip’s appearance, such as the background
color, can be set with calls to the lattice package’s
trellis.par.set:
lattice::trellis.par.set(strip.background=list(col="gray90"))
visreg(fit, "Wind", by="Heat", layout=c(3,1))
Graphical options: ggplot2
As discussed on the ggplot2 page,
most ggplot2 options are specified via additional
components to the plot, such as:
visreg(fit, "Wind", by="Heat", gg=TRUE) + theme_bw()
The exception, again, is the appearance of points/lines/bands, which
are specified with the usual visreg arguments:
