使用r中的facet_wrap将表添加到ggplot2

时间:2018-03-25 11:17:34

标签: r ggplot2

我想添加一个表格,其中包含一些信息,这些信息在构面中的每个面板中都会有所不同。 我正在使用ggplot2和facet_grid。

说我想为每个面板添加某种描述性统计数据,但它们不一定相同。 这些统计数据放在我为此目的制作的df中。

我找到了一些方法将这些表添加到图表中,但是:

  1. 就我而言,Annotate会为我提供与该方面所有面板相同的表格。
  2. 我真的很想使用facet_warp来简化而不是grid_extra ......
  3. library(datasets)
    data(mtcars)
    ggplot(data = mpg, aes(x = displ, y = hwy, color = drv)) +
        geom_point() +
        facet_wrap( ~ cyl,scales="free_y")
    

    桌子的位置对我来说并不重要,但我不希望它与图表重叠。

    我的目标是该线程中两个答案之间的混合: Adding table to ggplot with facets

    第一个答案(带注释)对我来说不起作用,因为我希望每个图中的表都是唯一的。) 第二个答案更好,但我不希望它重叠或隐藏图表中的一些细节,并且在每个面板中的线/散点位于不同的位置,所以我不能像这样使用它。我希望它能像注释一样被附加。

1 个答案:

答案 0 :(得分:1)

try this

library(ggplot2)
library(tibble)
library(gridExtra)
library(grid)

GeomCustom <- ggproto(
  "GeomCustom",
  Geom,
  setup_data = function(self, data, params) {
    data <- ggproto_parent(Geom, self)$setup_data(data, params)
    data
  },

  draw_group = function(data, panel_scales, coord) {
    vp <- grid::viewport(x=data$x, y=data$y)
    g <- grid::editGrob(data$grob[[1]], vp=vp)
    ggplot2:::ggname("geom_custom", g)
  },

  required_aes = c("grob","x","y")

)

geom_custom <-  function(mapping = NULL,
           data = NULL,
           stat = "identity",
           position = "identity",
           na.rm = FALSE,
           show.legend = NA,
           inherit.aes = FALSE,
           ...) {
    layer(
      geom = GeomCustom,
      mapping = mapping,
      data = data,
      stat = stat,
      position = position,
      show.legend = show.legend,
      inherit.aes = inherit.aes,
      params = list(na.rm = na.rm, ...)
    )
}


gl <- list(tableGrob(iris[1:2,1:3]), 
           tableGrob(iris[1:4,1:3]),
           tableGrob(iris[1:3,1:3]),
           tableGrob(iris[1:2,1:2]))

dummy <- tibble(f=letters[1:4], grob = gl )

d <- tibble(x=rep(1:3, 4), f=rep(letters[1:4], each=3))

ggplot(d, aes(x,x)) +
  facet_wrap(~f) +
  theme_bw() +
  geom_custom(data=dummy, aes(grob=grob), x = 0.5, y = 0.5)