ОК, так что это было проще, чем я думал. Решение состоит в том, чтобы использовать gTree следующим образом (благодаря этому примеру):
GeomFafik <- ggproto("GeomFafik",
Geom,
required_aes=c("xmin", "ymin", "xmax", "ymax"),
default_aes=aes(shape=19, colour="black"),
draw_key=draw_key_blank(),
draw_panel=function(data, panel_params, coord) {
coords <- coord$transform(data, panel_params)
w <- coords$xmax - coords$xmin
h <- coords$ymax - coords$ymin
x <- coords$xmin + w/2
y <- coords$ymin + h/2
grob1 <- grid::rectGrob(x, y, width=w, height=h,
gp=gpar(col=coord$colour))
grob2 <- grid::pointsGrob(x=x, y=y,
gp=gpar(col=coord$colour))
grid::gTree("fafik_grob", children=grid::gList(grob1, grob2))
})
geom_fafik <- function(mapping = NULL, data = NULL, stat = "identity",
position = "identity", na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE, ...) {
layer(
geom = GeomFafik, mapping = mapping, data = data, stat = stat,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...)
)
}
Результат, чего я и хотел: