ggplot2: возвращаемое значение из draw_panel - PullRequest
1 голос
/ 08 июля 2019

Я учусь кодировать в ggplot2. Я хочу создать новый геом, который сделает что-то сложное, а не простой многоугольник. Скажем, прямоугольник с точкой посередине.

Когда я определяю свой новый объект geom, скажем, GeomFafik, мне нужно указать функцию draw_panel (или 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() или gTree() из grid? Или есть ggplot2 способ сделать это (аналогично zeroGrob)? И если grid, то какой из двух я должен использовать? И где я могу найти примеры? Страница справочника на самом деле мало что говорит.

1 Ответ

1 голос
/ 08 июля 2019

ОК, так что это было проще, чем я думал. Решение состоит в том, чтобы использовать 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, ...)
  )
}

Результат, чего я и хотел:

enter image description here

...