首页 > 解决方案 > ggplot2:draw_panel 的返回值

问题描述

我正在学习在 ggplot2 中编码。我希望创建一个新的几何图形,它使一些复杂的东西——而不是一个简单的多边形。比如说,一个中间有一个点的矩形。

当我定义我的新 geom 对象时,比如 GeomFafik,我需要指定返回draw_panelgrob 的函数(或draw_group,或任何一个)。这是它现在的样子(基于扩展的 ggplot2小插图:

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)
                  # how can I combine grob1 with grob2 and 
                  # return the result?
                  grob1 <- grid::rectGrob(coords$xmin, coords$ymin,
                                          width=coords$xmax - coords$xmin, 
                                          height=coords$ymax - coords$ymin,
                                          gp=gpar(col=coord$colour))
                  grob2 <- grid::pointsGrob(x=coords$xmin + (coords$xmax - coords$xmin)/2,
                                            y=coords$ymin + (coords$ymax - coords$ymax)/2,
                                            gp=gpar(col=coord$colour))
               })

我应该使用grob()or gTree() from构建一个 grob 是对的grid吗?或者有没有ggplot2办法做到这一点(类似于zeroGrob)?如果grid,那么我应该使用两者中的哪一个?我在哪里可以找到示例?手册页并没有说太多。

标签: rggplot2r-grid

解决方案


好的,所以这比我想象的要容易。解决方案是使用 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, ...)
  )
}

结果,这就是我想要的:

在此处输入图像描述


推荐阅读