R 拆除带有网格和GTTable的ggplot

R 拆除带有网格和GTTable的ggplot,r,ggplot2,gtable,r-grid,R,Ggplot2,Gtable,R Grid,我正在努力基于ggplot对象构建双轴绘图。在巴普蒂斯特的建议下,我把这个问题分成了几个小部分。目前的问题是: 如何在保留轴、轴标签、轴记号和网格线的同时从网格中删除所有数据?所说的“数据”是指与geom_line()和geom_points()相关联的数据 之所以要这样做,是因为在构建双轴绘图的过程中,我遇到了以下问题:一个grob的网格线将覆盖另一个grob的数据。通过删除数据线和数据点,将不会发生覆盖 让我明确一点:我确实有一些变通方法,包括在aes()中添加线型,并设置scale_lin

我正在努力基于
ggplot
对象构建双轴绘图。在巴普蒂斯特的建议下,我把这个问题分成了几个小部分。目前的问题是:

  • 如何在保留轴、轴标签、轴记号和网格线的同时从
    网格中删除所有数据?所说的“数据”是指与
    geom_line()
    geom_points()相关联的数据
  • 之所以要这样做,是因为在构建双轴绘图的过程中,我遇到了以下问题:一个grob的网格线将覆盖另一个grob的数据。通过删除数据线和数据点,将不会发生覆盖

    让我明确一点:我确实有一些变通方法,包括在aes()中添加线型,并设置scale_linetype_manual(值=c(“实心”、“空白”),或者发送“脱离网格”的数据,但我想对未进行过太多“整理”的绘图对象进行后期处理

    下面是一些代码和数字

    # Data
    df <- structure(list(Year = c(1950, 2013, 1950, 2013), Country = structure(c(1L, 
    1L, 2L, 2L), .Label = c("France", "United States"), class = "factor"), 
    Category = c("Hourly minimum wage", "Hourly minimum wage", 
    "Hourly minimum wage", "Hourly minimum wage"), value = c(2.14, 
    9.43, 3.84, 7.25), variable = c("France (2013 euros)", 
    "France (2013 euros)", "United States (2013 dollars)", "United States (2013 dollars)"
    ), Unit = c("2013 euros", "2013 euros", "2013 dollars", "2013 dollars"
    )), .Names = c("Year", "Country", "Category", "value", "variable", 
    "Unit"), row.names = c(NA, 4L), class = "data.frame")
    
    # Plot data with ggplot
    library(ggplot2)
    p <- ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) + 
    geom_line(size = 2) + 
    geom_point(size = 4) +
    theme(panel.grid.major = element_line(size = 1, colour = "darkgreen"), 
          panel.grid.minor = element_line(size = 1, colour = "darkgreen", linetype = "dotted"))
    
    # Manipulate grobs with gtable
    library(gtable)
    g <- ggplot_gtable(ggplot_build(p))
    ## Here remove the geom_line() and geom_point()
    ## g <- stripdata(g)  # pseudo-code!
    grid.newpage()
    grid.draw(g)
    

    一个更自然的策略是使用不可见的
    geom_blank
    图层,这样ggplot2仍然训练刻度等来构建绘图,但不显示任何数据。但是,由于您希望处理已格式化的绘图,您可能必须手动从绘图树中删除这些Grob。下面是一个尝试

    library(gtable)
    g <- ggplotGrob(p)
    
    stripdata <- function(g){
      keep <- grepl("border|grill", 
                    names(g[["grobs"]][[4]][["children"]]))
      g[["grobs"]][[4]][["children"]][!keep] <- NULL
      g
    }
    
    grid.newpage()
    grid.draw(stripdata(g))
    
    库(gtable)
    
    我真的不明白你为什么需要gridExtra,尽管我承认我没有阅读全部内容建议:与其提出一个非常复杂的多方面问题,不如试着把具体的问题分离出来,每个问题都用一个简单的例子作为一个单独的问题?
    p2$layers[[1]]或者,
    名称(ggplotGrob(p2)[[“grobs”][[4]][[“children”]]]
    可以帮助您识别要删除的子项,因为您不能有没有图层的ggplot。@baptiste,谢谢您的建议,我会尽快跟进!谢谢!后续问题:是
    gTree[GRID.gTree.72]
    总是在第四位?有没有办法用名字来称呼它?这是为了防止它出现在另一个绘图对象的不同位置。我可以按照
    g[[“grobs”]$gTree
    g[[“grobs”]]$GRID
    (用缩写的名字来称呼它)这样做吗您可能应该在布局中找到它在
    g$grobs
    中的位置,
    which(g[[“布局”][,“名称”]=“面板”)
    Great:帮助我了解grobs是如何设计的!FWIW我简要描述了(我所知道的)此wiki页面中的gtables:Hadley应我的请求在ggplot2中包含ggplotGrob,但它在内部做同样的事情(在其名称空间内,因此不需要附加GTTable)。
    p <- ggplot(data = within(df, value <- -999999), aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) + 
    geom_line() + 
    geom_point() +
    theme(panel.grid.major = element_line(size = 1, colour = "darkgreen"), 
          panel.grid.minor = element_line(size = 1, colour = "darkgreen", linetype = "dotted")) +
    scale_y_continuous(limits = c(1, 10))
    
    library(gtable)
    g <- ggplotGrob(p)
    
    stripdata <- function(g){
      keep <- grepl("border|grill", 
                    names(g[["grobs"]][[4]][["children"]]))
      g[["grobs"]][[4]][["children"]][!keep] <- NULL
      g
    }
    
    grid.newpage()
    grid.draw(stripdata(g))