代码之家  ›  专栏  ›  技术社区  ›  Tyler Rinker DaniM

ggplot2 0.9.2中的数学符号

  •  4
  • Tyler Rinker DaniM  · 技术社区  · 13 年前

    当您想将数学符号添加到 facet_wrap 你过去可以使用 grid 包装如 (example taken from here) 以下为:

    library(ggplot2); library(grid)
    d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) 
        xlim(0, 2) + stat_binhex(na.rm = TRUE) + opts(aspect.ratio = 1)
    d <- d + facet_wrap(~ color, ncol = 4)
    grob <- ggplotGrob(d)
    strip_elem <- grid.ls(getGrob(grob, "strip.text.x", grep=TRUE, global=TRUE))$name
    grob <- editGrob(grob, strip_elem[1], label=expression(Y[1]))
    grid.draw(grob)
    

    这不再有效,因为它会出现以下错误:

    >  strip_elem <- grid.ls(getGrob(grob, "strip.text.x", grep=TRUE, global=TRUE))$name
    Error in getGrob(grob, "strip.text.x", grep = TRUE, global = TRUE) : 
      It is only valid to get a child from a 'gTree'
    > grob <- editGrob(grob, strip_elem[1], label=expression(Y[1]))
    Error in editGrob(grob, strip_elem[1], label = expression(Y[1])) : 
      object 'strip_elem' not found
    

    我们如何在0.9.2版本中添加数学符号?

    1 回复  |  直到 9 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    使现代化 使用facet_wrap_labeller函数可能更容易 available from here

    library(ggplot2)
    library(gtable)
    
    d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) +
        xlim(0, 2) + stat_binhex(na.rm = TRUE) + theme(aspect.ratio = 1)
    (d <- d + facet_wrap(~color, ncol = 4))    
    
    facet_wrap_labeller <- function(gg.plot, labels=NULL) {
      require(gridExtra)
    
      g <- ggplotGrob(gg.plot)
      gg <- g$grobs      
      strips <- grep("strip_t", names(gg))
    
      for(ii in seq_along(labels))  {
        modgrob <- getGrob(gg[[strips[ii]]], "strip.text", 
                           grep=TRUE, global=TRUE)
        gg[[strips[ii]]]$children[[modgrob$name]] <- editGrob(modgrob,label=labels[ii])
      }
    
      g$grobs <- gg
      class(g) = c("arrange", "ggplot",class(g)) 
      return(g)
    }
    
    # Some arbitrary strip texts
    StripTexts = expression(Y[1], E, F, G, H, I, J)
    
    # Apply the facet_wrap_labeller function
    g = facet_wrap_labeller(d, StripTexts)
    
    # Draw it
    g
    

    原始解决方案 通过一个小的编辑,使选择条形文本变得更容易。

    这很管用,但在中间有点乱。它使用 ggplot2 0.9.2 和来自 grid gtable 包装。必须有一种更简单的方法,我希望你能从中吸取一些东西,找到一个更简单的解决方案。

    步骤如下:

    • 绘制原始绘图;
    • 找到需要更换的条形元件;
    • 提取条形元素;
    • 将“D”更改为 expression(Y[1]) ;
    • 将修改后的条形元素重新插入到原始绘图中。

      library(ggplot2); library(grid); library(gtable)
      d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) +
          xlim(0, 2) + stat_binhex(na.rm = TRUE) + theme(aspect.ratio = 1)
      (d <- d + facet_wrap(~color, ncol = 4))    
      # The aim is to change the strip text "D" to expression(Y[1])
      
      # Winston's accessor function:
      gt_getgrob <- function(gt, pattern) {
        idx <- grep(pattern, gt$layout$name)
        if (length(idx) > 1)
          stop("More than one match for pattern '", pattern, "'")
        gt$grobs[[idx]]
      }
      
      g = ggplotGrob(d)
      g$layout    # We want "strip_t-1"
      strip <- gt_getgrob(g, "t-1")        # Use the accessor function to extract it.
      str(strip)     # Locate the "D" label
      
      strip$children[[2]]$label = expression(Y[1])    # Change the label.
      grid.draw(strip)       # Yes, it's worked
      
      gt <- ggplot_gtable(ggplot_build(d))  
      gtable_show_layout(gt)       # Get the layout of the original plot.
      
      gt = gtable_add_grob(gt, strip, t=3, l=4, b=3, r=4)  # Insert the modified strip element into the plot.
      grid.newpage()
      grid.draw(gt)  
      

    结果是:

    enter image description here

    推荐文章