I\'m using the code below to enrich a box plot with a summary table for categorical variable created on the x-axis.
# Libs
require(ggplot2); require(gridExtr
This is just an illustration of the comment.
ggp <- ggplot(data = mtcars, aes(x = factor(cyl), y = qsec, fill = as.factor(gear))) +
geom_boxplot() +
scale_y_continuous(limits = quantile(mtcars$qsec, c(0.1, 0.9))) +
scale_fill_tableau("gear",palette = "tableau10") +
xlab("cyl") + ylab("qsec") +
facet_wrap(~am)
# this requires gridExtra 2.0.0
tt <- ttheme_default(core = list(fg_params=list(cex = 0.7)),
colhead = list(fg_params=list(cex = 0.7)))
grid.newpage()
grid.draw(arrangeGrob(ggp))
grid.draw(grobTree(tableGrob(fun_dta_sum(var_sum = mtcars$qsec, group = mtcars$cyl, data = mtcars),
rows=NULL, theme=tt),
vp=viewport(x=unit(0.20,"npc"),y=unit(0.20,"npc"))))
The point is that you really just need to tweak the x=...
and y=...
arguments to viewport(...)
. Using annotation_custom(...)
, even if you could hack the gTable to get rid of one of the grobs, you would still need to tweak the position (using xmin=...
and ymin=...
). This approach does not maintain the relative position when you shrink or enlarge the image, but neither does annotation_custom(...)
, so overall I don't really see this as any more difficult.
It would probably make sense to let annotation_custom access facetting info *; this trivial change seems to do the trick,
library(ggplot2)
library(grid)
library(gridExtra)
annotation_custom2 <-
function (grob, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, data)
{
layer(data = data, stat = StatIdentity, position = PositionIdentity,
geom = ggplot2:::GeomCustomAnn,
inherit.aes = TRUE, params = list(grob = grob,
xmin = xmin, xmax = xmax,
ymin = ymin, ymax = ymax))
}
p <- ggplot(mtcars) + geom_point(aes(mpg, wt)) + facet_wrap(~ cyl)
tg <- tableGrob(iris[1:2,1:2], rows=NULL)
# position the table within the annotation area
tg$vp=viewport(x=unit(0,"npc") + 0.5*sum(tg$widths),
y=unit(0,"npc") + 0.5*sum(tg$heights))
# need to wrap in a gTree since annotation_custom overwrites the vp
g <- grobTree(tg)
p + annotation_custom2(g, data=data.frame(cyl=8))
Edit * hadley has a different view though, annotation
is designed to appear in all panels. It's not clear to me how to produce the geom equivalent for this particular case, if possible.