Removing one tableGrob when applied to a box plot with a facet_wrap

后端 未结 2 1086
梦谈多话
梦谈多话 2020-12-01 22:37

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         


        
相关标签:
2条回答
  • 2020-12-01 23:01

    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.

    0 讨论(0)
  • 2020-12-01 23:07

    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.

    0 讨论(0)
提交回复
热议问题