I have a lot of functions that generate plots, typically with ggplot2. Right now, I'm generating the plot and testing the underlying data. But I'd like to know if there's a reasonable way to test that the plot contains the layers/options I expect it to or that graphical elements match expectations.
For example:
library(ggplot2)
library(scales) # for percent()
library(testthat)
df <- data.frame(
Response = LETTERS[1:5],
Proportion = c(0.1,0.2,0.1,0.2,0.4)
)
#' @export plot_fun
plot_fun <- function(df) {
p1 <- ggplot(df, aes(Response, Proportion)) +
geom_bar(stat='identity') +
scale_y_continuous(labels = percent)
return(p1)
}
test_that("Plot returns ggplot object",{
p <- plot_fun(df)
expect_is(p,"ggplot")
})
test_that("Plot uses correct data", {
p <- plot_fun(df)
expect_that(df, equals(p$data))
})
This is where I'm stuck
test_that("Plot layers match expectations",{
p <- plot_fun(df)
expect_that(...,...)
})
test_that("Scale is labelled percent",{
p <- plot_fun(df)
expect_that(...,...)
})
Perhaps there's a more direct approach?
It's worth noting that the vdiffr package is designed for comparing plots. A nice feature is that it integrates with the testthat package -- it's actually used for testing in ggplot2 -- and it has an add-in for RStudio to help manage your testsuite.
This seems to be what you're aiming at, though specific requirements for plotting parameters and contents will vary of course. But for the example you nicely crafted above these tests should all pass:
This question and its answers offer a good starting point on other ways to characterize
ggplot
objects in case you have other things you'd like to test.What I also find useful in addition to the existing answers, is to test if a plot can actually be printed.